Spring 3.1 + Hibernate 4.1 JPA-Entity-manager-factory registriert ist zweimal
Ich bin mit Spring Framework 3.1 mit Hibernate 4.1 als JPA-provider, und ich habe eine voll funktionsfähige setup, aber jedes mal, wenn die web-app gestartet wird, sehe ich diese Warnmeldung:
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'
Funktionen der Anwendung ganz gut, aber Warnung Nachrichten wie die, die mich stören, und die Stunden des suchen und tüfteln und Experimentieren haben, führen mich nirgendwo. Ich habe versucht, die änderung der Fabrik Namen und das hinzufügen und weglassen von Blöcken von Konfiguration, alles ohne Erfolg. Es scheint, dass etwas in Spring oder Hibernate ist nur die Initialisierung der entity-manager-factory-doppelt.
Zur info, ich bin mit dem packagesToScan Funktionalität der LocalContainerEntityManagerFactorybean konfigurieren der entity-manager ohne persistence.xml Datei.
Habe ich reduziert, meine spring context XML zu den folgenden und das problem weiterhin besteht:
<?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>
Für die Vollständigkeit, die hier überwintern.Eigenschaften:
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.ejb.entitymanager_factory_name=something
Und hier ist ein Auszug der debug-Stufe log-Ausgabe von beiden org.springframework.orm und org.hibernate. Sie können sehen, wie bei 14:40:06,911 der EntityManagerFactory angemeldet ist das erste mal, und sofort danach die LocalContainerEntityManagerFactorybean erscheint ganz zu Beginn vom Anfang. Huh.
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'
Ja, ich bin, und Sie nagelte ihn. Das DispatcherServlet war der laden der gleiche Kontext-Datei wie der ContextLoaderListener, und bam, Bohnen zweimal geladen. Newbie Fehler, wie peinlich! Wenn Sie möchten, formulieren Sie Ihren Kommentar als eine Antwort wäre ich glücklich, es zu akzeptieren. Danke!
Wir sind alle Anfänger bei sowas, es ist nichts zu schämen.
InformationsquelleAutor Wilson Jackson | 2012-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie sind Sie mit der Initialisierung von Spring Application Context? Sind Sie mit Spring MVC?
Habe ich gesehen, manchmal Spring MVC, XML-Konfigurationen importieren app. Zusammenhang XML, wodurch die Instanziierung zweimal einige Bohnen, weil Sie in der Anwendung deklariert Kontext und der web-Anwendung Kontext.
InformationsquelleAutor eolith
Stieß ich auf das gleiche Problem aber in einem anderen Szenario. Die
EntityManagerFactoryRegistry
produziert die gleicheHHH000436
Warnung bei Ausführung von mehreren tests im gleichen Lauf (d.h. in der gleichen JVM) gestartet, von meiner IDE.Das problem kann auftauchen falls es mindestens zwei test-Klassen mit der
SpringJUnit4ClassRunner
zu laden verschiedenen Spring-test-Anwendung Kontexten mit jeweils einerEntityManagerFactory
.Die Ursache ist, dass Hibernate verwaltet eine statische Registrierung von
EntityManagerFactory
Instanzen, wo die Entstehung der zweiten Instanz kann die Ursache der Kollision der log-Nachricht. Also, warum ist nicht die erste Instanz deregistriert werden, nachdem der erste test beendet? Es würde in der Regel, wenn die app-Kontext mit, dassEntityManagerFactory
Instanz zerstört wird. Der Grund, es passiert nicht während der Testausführung ist, dass die Feder-test-context-framework speichert alle geladenen Kontexten, um zu vermeiden, re-das laden der exakt gleichen Kontext möglicherweise erforderlich, die von mehreren tests. Als Ergebnis, Bohnen in diesen Kontexten nicht zerstört, bis nach dem letzten test fertig ausgeführt wurde, und der Ruhezustand wird nur sammeln Sie alleEntityManagerFactory
Instanzen, die jemals geschaffen.Es ist wirklich ein nicht-Problem, aber wenn jemand wirklich genervt von der Warnung, es gibt ein paar Möglichkeiten, um zu vermeiden, dass es:
EntityManagerFactory
Instanzen bekommen einen anderen Namen (Sie sind sortiert nach dem Namen in der registry). Chek den Konstruktor vonEntityManagerFactoryImpl
auf, wie der name abgeleitet ist.@DirtiesContext
auf die test-Klasse, um die Ursache zuSpringJUnit4ClassRunner
schließen Sie den Rahmen und entfernen Sie Sie aus dem Kontext-cache unmittelbar nach der Ausführung der Testklasse.EntityManagerFactoryRegistry
Fehler...Hoffe, das jemand hilft.
InformationsquelleAutor zagyi