2012-06-02 36 views
10

JPAプロバイダとしてHibernate 4.1でSpring Framework 3.1を使用していますが、完全に機能する設定ですが、Webアプリケーションを起動するたびに警告メッセージ:うまくSpring 3.1 + Hibernate 4.1 JPA、エンティティマネージャファクトリが2回登録されました

14:28:12,725 WARN pool-2-thread-12 internal.EntityManagerFactoryRegistry:80 - HHH000436: Entity manager factory name (something) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name' 

アプリケーションの機能が、それは私を気のような警告メッセージ、および検索し、微調整や実験の時間はどこに私をリードしていません。私は工場名を変更し、設定のチャンクを追加したり省略したりしてみました。 SpringまたはHibernateの何かが、エンティティマネージャファクトリを2回だけ初期化しているようです。

FYI、LocalContainerEntityManagerFactoryBeanのpackagesToScan機能を使用して、persistence.xmlファイルなしでエンティティマネージャを設定しています。

私は次のように私の春のコンテキストXMLを下に切り詰めて、問題が解決しました:完全性については

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <context:property-placeholder location="classpath:jdbc.properties"/> 
    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.nightsword.driverClassName}"/> 
    <property name="url" value="${jdbc.nightsword.url}"/> 
    <property name="username" value="${jdbc.nightsword.username}"/> 
    <property name="password" value="${jdbc.nightsword.password}"/> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="x.y"/> 
    </bean> 
</beans> 

を、ここにhibernate.propertiesです:

hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
hibernate.ejb.entitymanager_factory_name=something 

そしてここでは、デバッグレベルのログを抜粋していますorg.springframework.ormとorg.hibernateの両方から出力されます。 EntityManagerFactoryが最初から登録されている方法は14:40:06,911で、その直後にLocalContainerEntityManagerFactoryBeanが最初からすべて開始されているように見えます。ハァッ。

INFO: Deploying web application archive /opt/local/share/java/tomcat7/webapps/nightsword.war 
14:40:06,149 INFO pool-2-thread-13 jpa.LocalContainerEntityManagerFactoryBean:264 - Building JPA container EntityManagerFactory for persistence unit 'default' 
14:40:06,219 DEBUG pool-2-thread-13 type.BasicTypeRegistry:143 - Adding type registration boolean -> [email protected] 

... 

14:40:06,882 DEBUG pool-2-thread-13 internal.SessionFactoryRegistry:62 - Initializing SessionFactoryRegistry : [email protected] 
14:40:06,882 DEBUG pool-2-thread-13 internal.SessionFactoryRegistry:75 - Registering SessionFactory: a3219dd8-7d59-45ac-9a5a-0d13e38dbb04 (<unnamed>) 
14:40:06,882 DEBUG pool-2-thread-13 internal.SessionFactoryRegistry:82 - Not binding SessionFactory to JNDI, no JNDI name configured 
14:40:06,882 DEBUG pool-2-thread-13 internal.SessionFactoryImpl:487 - Instantiated session factory 
14:40:06,882 DEBUG pool-2-thread-13 internal.SessionFactoryImpl:1119 - Checking 0 named HQL queries 
14:40:06,883 DEBUG pool-2-thread-13 internal.SessionFactoryImpl:1142 - Checking 0 named SQL queries 
14:40:06,887 DEBUG pool-2-thread-13 internal.StatisticsInitiator:110 - Statistics initialized [enabled=false] 
14:40:06,910 DEBUG pool-2-thread-13 internal.EntityManagerFactoryRegistry:56 - Initializing EntityManagerFactoryRegistry : [email protected] 
14:40:06,911 DEBUG pool-2-thread-13 internal.EntityManagerFactoryRegistry:66 - Registering EntityManagerFactory: something 
14:40:06,967 INFO pool-2-thread-13 jpa.LocalContainerEntityManagerFactoryBean:264 - Building JPA container EntityManagerFactory for persistence unit 'default' 
14:40:06,967 DEBUG pool-2-thread-13 type.BasicTypeRegistry:143 - Adding type registration boolean -> [email protected] 

... 

14:40:07,128 DEBUG pool-2-thread-13 internal.SessionFactoryRegistry:75 - Registering SessionFactory: 81a9b5a6-83aa-46ee-be68-d642e6fda584 (<unnamed>) 
14:40:07,128 DEBUG pool-2-thread-13 internal.SessionFactoryRegistry:82 - Not binding SessionFactory to JNDI, no JNDI name configured 
14:40:07,129 DEBUG pool-2-thread-13 internal.SessionFactoryImpl:487 - Instantiated session factory 
14:40:07,129 DEBUG pool-2-thread-13 internal.SessionFactoryImpl:1119 - Checking 0 named HQL queries 
14:40:07,129 DEBUG pool-2-thread-13 internal.SessionFactoryImpl:1142 - Checking 0 named SQL queries 
14:40:07,129 DEBUG pool-2-thread-13 internal.StatisticsInitiator:110 - Statistics initialized [enabled=false] 
14:40:07,130 DEBUG pool-2-thread-13 internal.EntityManagerFactoryRegistry:66 - Registering EntityManagerFactory: something 
14:40:07,130 WARN pool-2-thread-13 internal.EntityManagerFactoryRegistry:80 - HHH000436: Entity manager factory name (something) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name' 
+2

Spring Application Contextをどのように初期化していますか? web.xmlにorg.springframework.web.context.ContextLoaderListenerが宣言されていますか? Spring MVCを使用していますか?私は時々、他のアプリケーションをインポートするSpring MVC XML設定を見たことがあります。コンテキストXMLは、アプリケーションコンテキストとWebアプリケーションコンテキストで宣言されているため、いくつかのBeanをインスタンス化します。 – eolith

+0

はい、私はあなたです。 DispatcherServletはContextLoaderListenerと同じコンテキストファイルをロードしていましたが、bamは2回読み込まれたBeanです。初心者のミス、どのように恥ずかしい!あなたが答えとしてあなたのコメントを言い換えたいのであれば、私はそれを受け入れてうれしいです。ありがとう! –

+0

私たちはすべて初心者ですが、恥ずかしいことは何もありません。 – eolith

答えて

9

Spring Application Contextをどのように初期化していますか? Spring MVCを使用していますか?

他のアプリをインポートするSpring MVC XML設定があることがあります。コンテキストXMLは、アプリケーションコンテキストとWebアプリケーションコンテキストで宣言されているため、いくつかのBeanをインスタンス化します。

12

私は同じ問題を抱えていましたが、別のシナリオでした。 EntityManagerFactoryRegistryは、同じ実行(つまり同じJVM)で複数のテストをIDEから起動すると、同じHHH000436という警告を生成します。

問題が異なるスプリングテストアプリケーションコンテキストEntityManagerFactoryを含むそれぞれをロードするSpringJUnit4ClassRunnerを用い少なくとも二つテストクラスが存在する場合の表面ことができます。

Hibernateは、EntityManagerFactoryインスタンスの静的レジストリを維持しており、2番目のインスタンスを作成するとログメッセージの衝突が発生する可能性があります。最初のテストが実行終了した後、最初のインスタンスが登録抹消されないのはなぜですか?その通常は、そのEntityManagerFactoryインスタンスを含むアプリコンテキストが破棄されます。テスト実行中に発生しない理由は、Springテストコンテキストフレームワークは、複数のテストによって潜在的に必要とされる正確に同じコンテキストを再ロードすることを避けるために、ロードされたコンテキストをすべてキャッシュすることです。その結果、これらのコンテキスト内のBeanは、最後のテストが実行を終了するまで破壊されず、Hibernateはこれまでに作成されたすべてのEntityManagerFactoryインスタンスを収集します。それは本当に非の問題だ、誰かが、警告メッセージによって、本当にイライラしている場合は、それを見ないようにするいくつかの可能な方法がある

  1. EntityManagerFactoryインスタンスが別の名前を取得していることを確認します(彼らはレジストリに名前でキーインされています)。名前の由来については、EntityManagerFactoryImplのコンストラクタChekを参照してください。
  2. @DirtiesContextをテストクラスで使用すると、SpringJUnit4ClassRunnerはコンテキストを閉じて、テストクラスの実行直後にコンテキストキャッシュからコンテキストを削除します。
  3. だけでエラーにEntityManagerFactoryRegistryのログレベルを設定...

・ホープこれは誰かに役立ちます。

関連する問題