Impossible d'utiliser une EntityTransaction lors de l'utilisation de JTA
Je reçois cette erreur:
javax.servlet.ServletException: java.lang.IllegalStateException:
Exception Description: Cannot use an EntityTransaction while using JTA.
En essayant d'utiliser JPA et JAVAEE, Glassfish.
Mon persistence.xml fichier est le suivant:
<?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="acmeauction">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/MySQLJDBCResource</jta-data-source>
<class>it.uniroma3.acme.auction.model.User</class>
<class>it.uniroma3.acme.auction.model.Auction</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/acmeauction"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="javax.persistence.jdbc.password" value="password"/>
</properties>
</persistence-unit>
</persistence>
Ce que je suis en train de faire est de persister un objet (Utilisateur), de cette façon:
@ManagedBean
public class UserRepository implements Serializable{
@PersistenceUnit
EntityManagerFactory emf;
@PersistenceContext
private EntityManager em;
private static UserRepository instance;
/**
* Gives back the singleton UserRepository singleton.
*/
public static UserRepository getInstance() {
if (instance==null) {
instance = new UserRepository();
}
return instance;
}
private UserRepository() {
emf = Persistence.createEntityManagerFactory("acmeauction");
em = emf.createEntityManager();
}
/**
* Save and persist a new User.
*/
public void save(User user) {
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
}
}
Alors que si il essaie d'utiliser UserRepository à partir d'une simple application Java, il fonctionne correctement.
Merci d'avance,
UN
source d'informationauteur andreaxi
Vous devez vous connecter pour publier un commentaire.
Que les états d'erreur, si vous utilisez JTA pour les transactions, vous devez utiliser JTA.
Utiliser JTA un usertransaction à begin/commit de la transaction, ou d'utiliser un RESOURCE_LOCAL unité de persistance et non source de données jta.
Voir,
http://en.wikibooks.org/wiki/Java_Persistence/Transactions
Vous n'êtes pas censé utiliser
em.getTransaction().begin();
niem.getTransaction().commit();
ces instructions doivent être utilisées avecRESOURCE_LOCAL
type de transaction.Dans votre cas, la transaction est gérée par le conteneur, dans la première utilisation de la
EntitiyManager
dans votre méthode, le conteneur vérifie s'il existe une transaction active ou pas, si il n'y a pas de transaction active, alors il le crée, et lors de l'appel de méthode se termine, la transaction est validée par le conteneur. Ainsi, à la fin de votre méthode devrait ressembler à ceci:Le conteneur prend soin de la transaction, c'est-à JTA.