起動時にテキストファイルからDBのテーブルをいくつか書きたいと思っています。Spring Webアプリケーション:起動時に何かを行う(初期化)
私は、Spring(+ MVC)とHibernate with MySQLを使用しています。
どうすればいいですか?
起動時にテキストファイルからDBのテーブルをいくつか書きたいと思っています。Spring Webアプリケーション:起動時に何かを行う(初期化)
私は、Spring(+ MVC)とHibernate with MySQLを使用しています。
どうすればいいですか?
はどこか豆内部postconstuctアノテーションを使用します。
@PostConstruct
public void init() {
//startup logic here
}
はおそらくコンフィグレーションBeanを使用するように(設計、実装)理にかなっているが、それはまったくのBeanすることができます。
これで正しい方法で「初期設定」を行うことができますシングルトンとメソッドの@PostConstruct?ありがとうございました! :) –
これは、AsyncTasksを開始するためには機能しません。以下のsinuhepopの推奨を使用してください - http://stackoverflow.com/a/9680800/1019307 – HankCa
Hibernateには、起動時に実行されるSQL文を含むファイルをいくつか追加する方法があります。
パラメータはhibernate.hbm2ddl.import_files
です。
@see Hibernate Reference: Chapter 3.4. Optional configuration properties
SQL DMLにSessionFactoryの作成中に実行 文を含むオプションのファイルのカンマで区切られた名前。たとえば、INSERTステートメントを追加することにより、 は、 がデプロイされているときに最小限のデータセットをデータベースに取り込むことができます。
ファイルの順序は重要です。ファイルの文は、 より前に実行され、次のファイルの文が実行されます。これらのステートメントは、スキーマが作成された場合、すなわちhibernate.hbm2ddl.autoが を作成または作成するように設定されている場合にのみ実行される です。
/humans.sql,/dogs.sql
私が好きHibernateは「作成」モードで起動した場合にのみ動作することがいくつかのヒント。しかし、私は確信していません。
非常に便利です。それは質問自体への答えではありませんが...それは私が必要なものです!ありがとうございました!しかし、私はimport_filesを動作させることはできません:(それは私のクラスパスに "import.sql"を置くのではなく、完璧に実行します! –
アプリケーションリスナーは、そのようなニーズに合わせて設計されています。この場合、コンテキストが開始(またはリフレッシュ)されるたびに実行されます。
@Component
public class DatabaseFillerOnStartup implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
...
}
}
つのオプション、
まず:休止状態のサービスは(のみローカルまたはDEV環境用)の起動
<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:showSql="false"
p:generateDdl="true"/>
それとも春にINIT-とビーンを作成することです、あなたのDDL毎回作成してみましょうあなたがそれを持っていないか、あなたのスクリプトを挿入したり、何でもしたいならば、データベースを作成するロジックを追加してください。
<bean id="bootstrapStartup" class="com.tscompany.rest.bootstrap.BootstrapStartup" lazy-init="false" init-method="init"/>
あなたはルートコンテキストコンフィギュレーションの一部のBeanを作成することができます -
<bean id="someBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="someProperty">
... description of the property
</property>
<property name="targetMethod" value="methodName" />
</bean>
のようにこのように - アプリケーションの起動方法 "methodNameの" で呼び出すことができます。このような方法でDBのアップグレードを実施しています。
あなたがcreate
またはcreate-drop
に設定あなたのhibernate.hbm2ddl.auto
性質を持っている場合は、それを行うための最も簡単な方法は、例えば、データベーススキーマにあなたの最初のデータをロードするためにSQL文が含まれているSQLファイル名でhibernate.hbm2ddl.import_files
プロパティを設定することです最初のアプリケーションユーザー。
以下は、DatabaseConfig
クラスにあるメソッドの例です。 hibernate.hbm2ddl.import_files
プロパティをSQLファイル名import_initial_data.sqlに設定します。これには、データベースのスキーマに初期データを読み込むためのSQL Insert文が含まれています。
package com.beniregev.model;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor(access = AccessLevel.PUBLIC)
public class AppUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false, unique = true)
private String userName;
@Column(nullable = false)
private String password;
public AppUser(String userName, String password) {
this.userName = userName;
this.password = password;
}
}
ロンボクのためのMavenの依存関係:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
<scope>provided</scope>
</dependency>
私はresources
ディレクトリに持ってimport_initial_data.sqlファイル
@Bean
public LocalSessionFactoryBean hibernate5SessionFactoryBean(){
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource((DataSource) appContext.getBean("DataSource"));
localSessionFactoryBean.setAnnotatedClasses(AppUser.class);
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
properties.put("hibernate.hbm2ddl.auto","create-drop");
properties.put("hibernate.hbm2ddl.import_files", "import_initial_data.sql");
properties.put("hibernate.show_sql","true");
localSessionFactoryBean.setHibernateProperties(properties);
return localSessionFactoryBean;
}
これは私のAppUser.java
model
パッケージです。
INSERT INTO appuser(username, password) VALUES ('jesus', 'christ');
INSERT INTO appuser(username, password) VALUES ('mary', 'virgin');
INSERT INTO appuser(username, password) VALUES ('josef', 'who?');
INSERT INTO appuser(username, password) VALUES ('jeremaia', 'profet');
COMMIT;
そしてAPPUSER FROM * SELECT *の結果; *:
[起動時にデータベースからスプリングWebアプリケーションの初期化(の可能重複http://stackoverflow.com/questions/ 7082594/spring-web-application-initialization-from-startup-database) –
@Tomasz Nurkiewicz:はhttp://stackoverflow.com/questions/7082594/spring-web-application-initialization-fromの複製ではありませんなぜなら、情報フローは別の方法であるため、問題を解決するために他の方法を使うことができるからです。 – Ralph
それは非常に似ています。私のほうが少し一般的です。 –