Printemps 3.1 + Hibernate 4.1 JPA, l'Entité gestionnaire de l'usine est enregistré deux fois
Je suis en utilisant le Framework Spring 3.1 avec Hibernate 4.1 en tant que fournisseur JPA, et j'ai un entièrement fonctionnel de l'installation, mais à chaque fois que l'application web est démarré, je vois ce message d'avertissement:
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'
L'application fonctionne correctement, mais les messages d'avertissement comme ça me dérange pas, et des heures de recherches et de peaufiner et d'expérimenter m'ont conduit nulle part. J'ai essayé de changer le nom de l'usine et de l'ajouter et de supprimer des morceaux de configuration, en vain. Il semble que quelque chose, au Printemps ou en veille prolongée est juste de l'initialisation de l'entité gestionnaire de l'usine deux fois.
Pour info, je suis en utilisant le packagesToScan la fonctionnalité de la LocalContainerEntityManagerFactorybean pour configurer le gestionnaire d'entité sans persistence.xml fichier.
J'ai épuré mon printemps contexte XML pour la suite et le problème persiste:
<?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>
Pour être complet, voici hibernate.propriétés:
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.ejb.entitymanager_factory_name=something
Et voici un extrait de débogage au niveau de la sortie du journal des deux org.springframework.l'orm et org.mise en veille prolongée. Vous pouvez voir comment à 14:40:06,911 l'EntityManagerFactory est enregistrée à partir de la première fois, et, immédiatement après, la LocalContainerEntityManagerFactorybean semble tout recommencer depuis le début. Hein.
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'
Oui, je le suis, et vous cloué. La DispatcherServlet était en train de charger le même fichier de contexte comme le ContextLoaderListener, et bam, haricots chargé à deux reprises. Newbie erreur, comment embarrassant! Si vous voulez reformuler votre commentaire comme une réponse, je serais heureux de l'accepter. Merci!
Nous sommes tous des débutants à quelque chose, ça n'a rien à avoir honte.
OriginalL'auteur Wilson Jackson | 2012-06-02
Vous devez vous connecter pour publier un commentaire.
Comment êtes-vous initialisation de votre Ressort de Contexte de l'Application? Êtes-vous à l'aide de Spring MVC?
J'ai vu parfois, Spring MVC configurations XML d'importer les autres app. contexte XML, provoquant l'instanciation deux fois certains haricots, car elles sont déclarées dans le contexte de l'application et le contexte d'application web.
OriginalL'auteur eolith
Je suis tombé sur le même problème mais dans un contexte différent. Le
EntityManagerFactoryRegistry
produit le mêmeHHH000436
avertissement, lors de l'exécution de plusieurs tests dans la même course (c'est à dire la même JVM) a commencé à partir de mon IDE.Le problème de la surface dans le cas où il y a au moins deux classes de test à l'aide de la
SpringJUnit4ClassRunner
pour charger différents Printemps de l'application de test contextes contenant chacun unEntityManagerFactory
.La cause est que Hibernate maintient un registre statique de
EntityManagerFactory
cas, où la création de la deuxième instance peut provoquer la collision du message de journal. Alors pourquoi n'est pas la première instance radié après le premier test de fin de l'exécution? Elle le fait normalement lorsque le contexte de l'application contenant queEntityManagerFactory
instance est détruite. La raison pour laquelle il ne se produit pas lors de l'exécution d'un test, c'est que le Printemps de test contexte cadre des caches de tous les chargés contextes afin d'éviter de re-chargement de l'exacte même contexte pourrait avoir besoin de plusieurs essais. En conséquence, les haricots dans ces contextes ne sont détruits qu'après le dernier test fini de s'exécuter, et Hibernate va juste recueillir tous lesEntityManagerFactory
instances jamais créé.C'est vraiment un non-problème, mais si quelqu'un est vraiment gêné par le message d'avertissement, il existe quelques méthodes possibles pour éviter de le voir:
EntityManagerFactory
instances obtenir un nom différent (ils sont marqués par leur nom dans le registre). Chek le constructeur deEntityManagerFactoryImpl
sur la façon dont le nom est dérivé.@DirtiesContext
sur la classe de test pour provoquer laSpringJUnit4ClassRunner
pour fermer le contexte et la retirer de son contexte cache immédiatement après l'exécution de la classe de test.EntityManagerFactoryRegistry
à l'erreur...Espère que cela aide quelqu'un.
OriginalL'auteur zagyi