À l'aide de Printemps défini transactionManager en JPA/Hibernate
Supposons que vous utilisez JPA, Spring, Hibernate comme implémentation JPA.
JPA mode de transaction est "JTA", de sorte que vous besoin de passer le conteneur transactionManager de mise en veille prolongée.
La réponse classique est de mettre en hibernate.transaction.manager_lookup_class
à la classe de votre serveur.
Cependant, je pense que c'est une honte d'avoir cette dépendre de serveur de configuration spécifiques comme vous l'avez déjà trouvé la transactionManager au Printemps avec <tx:jta-transaction-manager>
.
Est-il un moyen de donner à ce transactionManager mise en veille prolongée avec une configuration comme
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="persistence_unit_name"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.manager_lookup_class">
org.hibernate.transaction.SunONETransactionManagerLookup
</prop>
</props>
</property>
</bean>
<tx:jta-transaction-manager/>
Le but est de se débarrasser de la org.hibernate.transaction.SunONETransactionManagerLookup
de la propriété.
En passant, j'ai vraiment deux différentes implémentations de serveur à l'esprit.
EDIT : sans le gestionnaire de transactions de configuration, Hibernate étouffe lors de la création de l'EntityManagerFactory :
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [file:/C:/configuration/afoCuad-metier-ear/entitymanager-base-context.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: fr.tm.ima.cuad-afoCuad-metier-ejb-PU] Unable to build EntityManagerFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:529)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:495)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:656)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:629)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:338)
... 80 more
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: fr.tm.ima.cuad-afoCuad-metier-ejb-PU] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:901)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 93 more
Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:401)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:892)
... 98 more
OriginalL'auteur mleduque | 2010-09-29
Vous devez vous connecter pour publier un commentaire.
Malheureusement, si l'on regarde l'Api Hibernate comme de nombreux autres produits JBoss ils ont une classe généralement appelée Configuration pour la plupart, si pas tous les principaux config choses. Malheureusement, ils (JBoss) semble détenir des "Chaînes" pour les paramètres et la classe pour localiser des instances. Presque toujours, souvent impossible d'établir simplement une réelle premade prêt à aller de l'installation.
Je suis sur le point d'essayer quelque chose de semblable à ce qui suit pour la même raison, vous êtes de mentionner.
OriginalL'auteur mP.
Tout d'abord - ne vous vraiment besoin JTA? Généralement spring+hibernate ne l'exige pas. Vous pouvez utiliser un simple
JpaTransactionManager
/HibernateTransactionManager
.Si vous voulez vraiment JTA, alors vous aurez besoin d'un JTA fournisseur. Si pas en cours d'exécution dans une application serveur, vérifiez cette question pour savoir comment utiliser la JTA dans un conteneur de servlet. (Jetez aussi un oeil à cette question)
Enfin, hibernate docs préciser que, pour container-managed transactions:
Le deuxième point, c'est peut-être quelque chose que vous avez manqué?
Ce que dit la documentation en plus de cela (la section suivante), c'est que si vous voulez déclarative des transactions, mise en veille prolongée n'est pas là où vous devriez regarder. Vous auriez besoin de créer un intercepteur. C'est exactement ce printemps responsables de la transaction. Et que serait mon choix compte tenu de votre pile de technologie (Printemps).
Si vous souhaitez ne pas reposer sur un seul JTA fournisseur, puis faire deux versions. Par exemple maven a "des profils maven", qui permettent de faire des versions pour différents environnements.
les gens avec une vision plus large de la technologie de l'assumer certaines choses en raison de leur expérience. Pour exemple, j'ai rarement vu un printemps app avec JTA, alors que j'ai vu de nombreux cas où les gens se jettent sur elle, sans réellement dans le besoin. Pour le reste de votre commentaire - voir ma mise à jour.
pourquoi serait-on utiliser le Printemps TM couche... il ne se passe rien juste une autre couche avec différents noms de méthode et n'ajoute pas de nouvelles ou de meilleures fonctionnalités sur JTA. À la fin sa va faire une recherche jndi (si l'on utilise le JTA impl) qui se retrouve dans le même problème de la magie des Cordes et des singletons.
printemps de gestion des transactions ne pas utiliser de JTA. Il a ses propres gestionnaires de transactions qui font un très bon travail. En dehors de cela - qu'il fournit une abstraction sur les différents types de technologies transactionnelles. Ainsi vous pouvez annoter vos objets et si vous passer, plus tard, la transaction stratégies de gestion, il suffit de changer quelques configurations.
OriginalL'auteur Bozho
J'ai récemment fait quelques trucs avec JPA/Graal et de la configuration que j'ai utilisé était le long de ces lignes:
Cette aide?
OriginalL'auteur JGFMK