복붙노트

[SPRING] Spring 3.1 + Hibernate 4.1 JPA, 엔티티 관리자 팩토리가 두 번 등록 됨

SPRING

Spring 3.1 + Hibernate 4.1 JPA, 엔티티 관리자 팩토리가 두 번 등록 됨

나는 JPA 프로 바이더로서 Hibernate 4.1과 함께 Spring Framework 3.1을 사용하고 있으며, 완전한 기능을 갖춘 설정을 가지고있다. 그러나 웹 애플리케이션이 시작될 때마다 나는이 경고 메시지를 보게된다 :

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에서 엔티티 관리자 팩토리를 두 ​​번 초기화하는 것으로 보인다.

참고로, 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 -> org.hibernate.type.BooleanType@4cb91eff

...

14:40:06,882 DEBUG pool-2-thread-13 internal.SessionFactoryRegistry:62 - Initializing SessionFactoryRegistry : org.hibernate.internal.SessionFactoryRegistry@161bb7fe
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 : org.hibernate.ejb.internal.EntityManagerFactoryRegistry@75cc9008
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 -> org.hibernate.type.BooleanType@4cb91eff

...

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'

해결법

  1. ==============================

    1.Spring Application Context를 어떻게 초기화하고 있습니까? Spring MVC를 사용하고 있습니까?

    Spring Application Context를 어떻게 초기화하고 있습니까? Spring MVC를 사용하고 있습니까?

    나는 때때로 다른 MVC XML 설정이 다른 앱을 가져 오는 것을 보았다. 컨텍스트 XML은 응용 프로그램 컨텍스트와 웹 응용 프로그램 컨텍스트에서 선언되기 때문에 빈을 두 번 인스턴스화합니다.

  2. ==============================

    2.나는 같은 문제를 겪었지만 다른 시나리오에서 우연히 만났다. EntityManagerFactoryRegistry는 IDE에서 동일한 실행 (즉, 동일한 JVM)에서 여러 테스트를 실행할 때 동일한 HHH000436 경고를 생성합니다.

    나는 같은 문제를 겪었지만 다른 시나리오에서 우연히 만났다. EntityManagerFactoryRegistry는 IDE에서 동일한 실행 (즉, 동일한 JVM)에서 여러 테스트를 실행할 때 동일한 HHH000436 경고를 생성합니다.

    SpringJUnit4ClassRunner를 사용하여 각각 Spring 테스트 애플리케이션 컨텍스트를로드하기 위해 적어도 두 개의 테스트 클래스가있는 경우 문제가 발생할 수 있습니다. 각각의 테스트 애플리케이션 컨텍스트에는 각각 EntityManagerFactory가 포함되어 있습니다.

    근본적인 원인은 Hibernate가 EntityManagerFactory 인스턴스의 정적 레지스트리를 관리한다는 점이다. 두 번째 인스턴스를 생성하면 로그 메시지에 대한 충돌이 발생할 수있다. 그렇다면 첫 번째 테스트가 실행 완료된 후 첫 번째 인스턴스가 등록 취소되지 않는 이유는 무엇입니까? 해당 EntityManagerFactory 인스턴스가 포함 된 응용 프로그램 컨텍스트가 파손될 때 일반적으로 발생합니다. 테스트 실행 중 발생하지 않는 이유는 Spring 테스트 컨텍스트 프레임 워크가로드 된 컨텍스트를 모두 캐시하여 여러 테스트에서 잠재적으로 필요한 동일한 컨텍스트를 다시로드하지 않기 때문입니다. 결과적으로, 이러한 문맥의 빈은 마지막 테스트가 실행을 마칠 때까지 파괴되지 않으며, Hibernate는 지금까지 생성 된 모든 EntityManagerFactory 인스턴스를 수집 할 뿐이다.

    실제로는 문제가 아니지만 누군가 경고 메시지에 정말 짜증이 나면이를 보는 것을 피할 수있는 몇 가지 방법이 있습니다.

    희망이 사람을 도움이됩니다.

  3. from https://stackoverflow.com/questions/10866263/spring-3-1-hibernate-4-1-jpa-entity-manager-factory-is-registered-twice by cc-by-sa and MIT license