2012-03-13 13 views
7

起動時にテキストファイルからDBのテーブルをいくつか書きたいと思っています。Spring Webアプリケーション:起動時に何かを行う(初期化)

私は、Spring(+ MVC)とHibernate with MySQLを使用しています。

どうすればいいですか?

+0

[起動時にデータベースからスプリングWebアプリケーションの初期化(の可能重複http://stackoverflow.com/questions/ 7082594/spring-web-application-initialization-from-startup-database) –

+1

@Tomasz Nurkiewicz:はhttp://stackoverflow.com/questions/7082594/spring-web-application-initialization-fromの複製ではありませんなぜなら、情報フローは別の方法であるため、問題を解決するために他の方法を使うことができるからです。 – Ralph

+0

それは非常に似ています。私のほうが少し一般的です。 –

答えて

5

はどこか豆内部postconstuctアノテーションを使用します。

@PostConstruct 
public void init() { 
    //startup logic here 
} 

はおそらくコンフィグレーションBeanを使用するように(設計、実装)理にかなっているが、それはまったくのBeanすることができます。

+0

これで正しい方法で「初期設定」を行うことができますシングルトンとメソッドの@PostConstruct?ありがとうございました! :) –

+0

これは、AsyncTasksを開始するためには機能しません。以下のsinuhepopの推奨を使用してください - http://stackoverflow.com/a/9680800/1019307 – HankCa

7

Hibernateには、起動時に実行されるSQL文を含むファイルをいくつか追加する方法があります。

パラメータはhibernate.hbm2ddl.import_filesです。

@see Hibernate Reference: Chapter 3.4. Optional configuration properties

  • 表3.7。その他のプロパティ
  • hibernate.hbm2ddl.import_files:
SQL DMLにSessionFactoryの作成中に実行 文を含むオプションのファイルの

カンマで区切られた名前。たとえば、INSERTステートメントを追加することにより、 は、 がデプロイされているときに最小限のデータセットをデータベースに取り込むことができます。

ファイルの順序は重要です。ファイルの文は、 より前に実行され、次のファイルの文が実行されます。これらのステートメントは、スキーマが作成された場合、すなわちhibernate.hbm2ddl.autoが を作成または作成するように設定されている場合にのみ実行される です。

/humans.sql,/dogs.sql

私が好きHibernateは「作成」モードで起動した場合にのみ動作することがいくつかのヒント。しかし、私は確信していません。

+0

非常に便利です。それは質問自体への答えではありませんが...それは私が必要なものです!ありがとうございました!しかし、私はimport_filesを動作させることはできません:(それは私のクラスパスに "import.sql"を置くのではなく、完璧に実行します! –

16

アプリケーションリスナーは、そのようなニーズに合わせて設計されています。この場合、コンテキストが開始(またはリフレッシュ)されるたびに実行されます。

@Component 
public class DatabaseFillerOnStartup implements ApplicationListener<ContextRefreshedEvent> { 
    @Override 
    public void onApplicationEvent(ContextRefreshedEvent event) { 
     ... 
    } 
} 
+0

便利、ありがとう:) –

+0

自己診断を行うために探していたもの。ありがとうございました! – Marquee

+0

これは答えです::) –

0

つのオプション、

まず:休止状態のサービスは(のみローカルまたは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"/> 
0

あなたはルートコンテキストコンフィギュレーションの一部の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のアップグレードを実施しています。

0

あなたが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.javamodelパッケージです。

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 *の結果; *:

Resultset of SELECT * FROM appuser;

関連する問題