6

There is a similar question but the accepted solution did not apply (Issue caused somehow by Spring MVC, which is not the case as it is in this similar question: Spring 3.1 + Hibernate 4.1 JPA, Entity manager factory is registered twice)

To be clear my only issue is the warning that the entity manager factory's(emf) name has been registered twice, I don't have any issues using JPA despite the warning.

So how is the emf name being loaded the first time if spring is not doing it, and should/how_do I stop it?

Environment: Glassfish v 3.1.1, Spring 3.1.1, JPA 2.0 (Hibernate-entity-manager 4.1.0), Struts2

I am getting the following warning:

WARN: HHH000436: Entity manager factory name (empsys) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'

Here is part of the server log (last line is the warning, I chopped off the top but rest is continuous):

INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
INFO: HHH000412: Hibernate Core {4.1.0.Final}
INFO: HHH000206: hibernate.properties not found
INFO: HHH000021: Bytecode provider name : javassist
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: empsys
    ...]
INFO: HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLInnoDBDialect
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory
INFO: HHH000397: Using ASTQueryTranslatorFactory
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
INFO: PWC1412: WebModule[null] ServletContext.log():No Spring WebApplicationInitializer types detected on classpath
INFO: PWC1412: WebModule[null] ServletContext.log():Initializing Spring root WebApplicationContext
INFO: Root WebApplicationContext: initialization started
INFO: Refreshing Root WebApplicationContext: startup date [Sat Sep 01 19:14:15 MDT 2012]; root of context hierarchy
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
INFO: JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning
INFO: JSR-330 'javax.inject.Named' annotation found and supported for component scanning
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
INFO: Bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#3170938b' of type [class org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO: Bean 'dataSource' of type [class org.springframework.jndi.JndiObjectFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO: Bean 'dataSource' of type [class com.sun.gjc.spi.jdbc40.DataSource40] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO: Building JPA container EntityManagerFactory for persistence unit 'empsys'
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: empsys
    ...]
INFO: HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLInnoDBDialect
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory
INFO: HHH000397: Using ASTQueryTranslatorFactory
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
WARN: HHH000436: Entity manager factory name (empsys) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>  
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>  
    <welcome-file-list>
        <welcome-file>/index.action</welcome-file>
    </welcome-file-list>
</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/jdbc
            http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/jee 
            http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
    <context:annotation-config/>            
    <context:component-scan base-package="com.kenmcwilliams.employmentsystem" />
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/empsys" /> 
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!--  <property name="persistenceUnitName" value="empsys" /> -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <property name="dataSource" ref="dataSource"/>

    </bean>
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
    <tx:annotation-driven  transaction-manager="transactionManager"/>
</beans>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="empsys" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/empsys</jta-data-source>
    <class>com.quaternion.orm.Something</class>
    <properties>
      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
    </properties>
  </persistence-unit>
</persistence>
Community
  • 1
  • 1
Quaternion
  • 10,380
  • 6
  • 51
  • 102

2 Answers2

4

It would seem Hibernate is asked to create an EMF for this PU twice. Hibernate tracks each EMF it builds in a registry. This warning is just telling you that an EMF was already registered under that same PU name. As the warning goes on to tell you that can be a problem if you cluster the application using that EMF. Otherwise its just a warning letting you know about the situation (and even how to resolve it).

Steve Ebersole
  • 9,339
  • 2
  • 48
  • 46
  • But how does hibernate know to create the EMF for this PU? Is it my container glassfish that causes hibernate to scan for and processes this instance? The fact that spring is trying to load this instance is no mystery and I want this I just don't understand how it is getting loaded the first time. – Quaternion Sep 02 '12 at 17:58
  • Perhaps. Most EE containers will scan deployments to test for various known type of deployments to see if special handling is needed (WAR, EAR, PAR, etc). The way JPA says that persistence archives can be recognized is the presence of persistence.xml. So that is a likely explanation. – Steve Ebersole Sep 03 '12 at 16:01
  • Was never able to determine the cause but accepting this answer because it seems plausible. – Quaternion Apr 04 '13 at 15:57
2

I believe the issue can be resolved here:

<context:component-scan base-package="com.kenmcwilliams.employmentsystem" />

You should filter out any packages/classes for JPA that are annotated with @Component, especially the one that creates the entity manager bean.

Classes annotated with @Component are scanned by default, at least for root context JPA configurations.

I had the same issue and resolved it by filtering the JPA configuration classes out of the component scan.

Quaternion
  • 10,380
  • 6
  • 51
  • 102