hibernate, mysql, glassfish v3, et la source de données JTA
Je suis d'essayer d'utiliser hibernate entity manager avec mysql et glassfish. J'obtiens l'erreur suivante lorsque vous essayez d'utiliser une source de données JTA:
Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:376)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1367)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:858)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:733)
... 37 more
Voici comment j'ai configuré mon persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
<persistence-unit name="myPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/mysql</jta-data-source>
<class>com.my.shared.entity.MyFile</class>
<class>com.my.shared.entity.MyRole</class>
<class>com.my.shared.entity.MyUser</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show.sql" value="true" />
</properties>
Cependant, lorsque je configure un non-source de données jta, il fonctionne très bien
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
<persistence-unit name="myPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>jdbc/mysql</non-jta-data-source>
<class>com.my.shared.entity.MyFile</class>
<class>com.my.shared.entity.MyRole</class>
<class>com.my.shared.entity.MyUser</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show.sql" value="true" />
</properties>
</persistence-unit>
</persistence>
C'est bien beau tout ça, mais je tiens vraiment à utiliser:
em.persist(myObject);
au lieu de:
em.getTransaction().begin();
em.persist(myObject);
em.getTransaction().commit();
Ai-je raté quelque chose avec hibernate configuration, ou est-il même possible d'utiliser une source de données JTA?
OriginalL'auteur KevMo | 2010-03-01
Vous devez vous connecter pour publier un commentaire.
Il semble que pour votre configuration, container-managed des transactions sont utilisées par défaut. Dans ce cas, vous devez définir un moyen de l'opération de synchronisation de sorte que la couche de persistance est informé (et peut mettre à jour le 2ème cache de niveau par exemple). Si vous avez besoin de définir
manager_lookup_class
propriété comme suit:Aussi, vous devez marquer les méthodes d'affaires que l'accès de la couche de données "transactionnelle". Pour cela vous avez besoin de les marquer avec
@javax.ejb.TransactionAttribute(REQUIRED)
(voir ici pour plus d'informations sur cette annotation).Vous avez également une option permettant de basculer bean-managed transactions. Vous pouvez le faire en disant:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Puis le haricot est responsable pour le début/la fin de la transaction:
Vous n'avez pas besoin de strart sur les transactions de manière déclarative comme
em.getTransaction().begin();
, que vous êtes à l'aide de la CMT. J'espère que, vous avez marqué votre méthode d'haricot avec@Transactional
?Ops, désolé, vous n'êtes pas à l'aide de Printemps 🙂 Suivez ma réponse ensuite.
OriginalL'auteur dma_k