2017-04-26 3 views
1

私はHibernateでspring-data-jpaを使用しているプロジェクトを持っており、メモリデータベースにH2を使用する統合テストを作成しています。私のDBのスクリプトでSpring-Data-Jpa DriverManagerDataSourceが2回初期化されました

は、テーブルの作成後、私は実際に私の統合テストを実行した後、いくつかの挿入文

INSERT INTO COST (paymentType, costValue, costCategory) VALUES ('INTERNATIONAL', 100, 'LICENSES'); 
INSERT INTO COST (paymentType, costValue, costCategory) VALUES ('INTERNATIONAL', 20, 'HARDWARE'); 

を実行しています、私は4つのエントリではなく、2

のが返還されたことを見ました

ログにより、テストでデータソースが2回初期化されていることが確認されました。その理由を理解したいと思います。どんな助けもありがとう。

2017-04-26 12:19:38; LOG_LEVEL = "DEBUG"; SOURCE = "org.springframework.jdbc.datasource.DriverManagerDataSource"; 、私の春の設定ファイルで

EVENT_MESSAGEは= "[: 'を作成-db.sqlクラスパス' からINIT = RUNSCRIPT; DB_CLOSE_DELAY = -1テスト:H2:MEM JDBC]に新しいJDBCのDriverManager接続の作成します"プロパティは

db.driver = org.h2.Driver 
db.url = jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM \'classpath:create-db.sql\' 
db.username = cost 
db.password = cost 
entitymanager.packages.to.scan = com.somecompany.cost 
hibernate.dialect = org.hibernate.dialect.H2Dialect 
hibernate.show_sql = false 
hibernate.format_sql = false 

乾杯

クリスある

@Bean 
public JpaTransactionManager transactionManager() { 
    if (transactionManager == null) { 
     transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
    } 
    return transactionManager; 
} 

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    if (entityManagerFactoryBean == null) { 

     entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
     entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(ENTITYMANAGER_PACKAGES_TO_SCAN)); 
     entityManagerFactoryBean.setJpaProperties(hibProperties());  
    } 
    return entityManagerFactoryBean; 
} 

@Bean 
public DriverManagerDataSource dataSource() { 

    if (dataSource == null) { 
     dataSource = new DriverManagerDataSource(); 

     dataSource.setDriverClassName(env.getRequiredProperty(DATABASE_DRIVER)); 
     dataSource.setUrl(env.getRequiredProperty(DATABASE_URL)); 
     dataSource.setUsername(env.getRequiredProperty(DATABASE_USERNAME)); 
     dataSource.setPassword(env.getRequiredProperty(DATABASE_PASSWORD)); 
    } 
    return dataSource; 
}  

以下のように@EnableJpaRepositoriesで注釈付け、それから永続関連Beanを作成します210

+0

hibProperties()メソッドを表示しますか?DATABASE_URL –

+0

元の投稿を編集して編集しました。 – krisrr3

答えて

0

db.urlプロパティから 'DB_CLOSE_DELAY = -1'を削除した後、正しい数のデータ行を取得し始めました。しかし2

である、私は、ログをチェックし、作成されたデータソースの2つのインスタンスが残っていたとのインスタンスが

ログの行

を再利用されていない理由を私は

以下であることを確認していませんライン1616

2017-04-27 09:41:58; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory"; EVENT_MESSAGE="Registering IdentifierGenerator strategy [enhanced-table] -> [org.hibernate.id.enhanced.TableGenerator]" 
2017-04-27 09:41:58; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.cfg.Configuration"; EVENT_MESSAGE="Preparing to build session factory with filters : {}" 
2017-04-27 09:41:58; LOG_LEVEL="DEBUG"; SOURCE="org.springframework.jdbc.datasource.DriverManagerDataSource"; EVENT_MESSAGE="Creating new JDBC DriverManager Connection to [jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:create-db.sql']" 

ライン2331

2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.hql.internal.ast.ErrorCounter"; EVENT_MESSAGE="throwQueryException() : no errors" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.SQL"; EVENT_MESSAGE="select cost0_.costId as costId1_0_, cost0_.costCategory as costCate2_0_, cost0_.costValue as costValu3_0_, cost0_.paymentType as paymentT4_0_ from Cost cost0_ where cost0_.paymentType=?" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.engine.jdbc.internal.LogicalConnectionImpl"; EVENT_MESSAGE="Obtaining JDBC connection" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.springframework.jdbc.datasource.DriverManagerDataSource"; EVENT_MESSAGE="Creating new JDBC DriverManager Connection to [jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:create-db.sql']" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.engine.jdbc.internal.LogicalConnectionImpl"; EVENT_MESSAGE="Obtained JDBC connection" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.loader.Loader"; EVENT_MESSAGE="Result set row: 0" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.loader.Loader"; EVENT_MESSAGE="Result row: EntityKey[com.somecompany.domain.Cost#1]" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.loader.Loader"; EVENT_MESSAGE="Result set row: 1" 
2017-04-27 09:41:59; LOG_LEVEL="DEBUG"; SOURCE="org.hibernate.loader.Loader"; EVENT_MESSAGE="Result row: EntityKey[com.somecompany.domain.domain.Cost#2] 
0

Y独自のdataSourceを作成する必要はありませんが、Springはすでにこれを行っています。あなたはデータソースが2番目です。このため、JDBC URLが2回呼び出されているため、スクリプトが2回実行されています。

私はお勧めします:

1)あなたのデータソースbeanを削除します。

2)data.sqlに、それがクラスパスにありますので、あなたのリソースディレクトリに追加するには、あなたの作成し-data.sqlに名前を変更します)

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" 

3にあなたのJDBC URLを変更します。

残りの部分は春に行う必要があります。マニュアルはhereを参照してください。

関連する問題