2012-06-06 4 views
9

Ich erhalte diese Fehlermeldung:kann kein EntityTransaction verwenden, während JTA mit

javax.servlet.ServletException: java.lang.IllegalStateException: 
Exception Description: Cannot use an EntityTransaction while using JTA. 

Bei dem Versuch, JPA und JavaEE, Glassfish zu verwenden.

Meine persistence.xml Datei ist wie folgt:

<?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> 

Was ich versuche zu tun ist, um ein Objekt (Benutzer), auf diese Weise beharren:

@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(); 
    } 
} 

Während, wenn es versuchen Sie, UserRepository von einer einfachen Java-Anwendung zu verwenden, funktioniert es richtig.

Vielen Dank im Voraus, AN

Antwort

8

Da die Fehlerzustände, wenn Sie JTA verwenden für Transaktionen, müssen Sie JTA verwenden.

Verwenden Sie entweder JTA UserTransaction, um die Transaktion zu starten/zu committen, oder verwenden Sie eine RESOURCE_LOCAL-Persistenzeinheit und eine nicht-jta-DataSource.

See, http://en.wikibooks.org/wiki/Java_Persistence/Transactions

+2

Vielen Dank, es ist peinlich, aber ich dachte, dass ein Teil des Codes funktioniert. Vielen Dank, – andreaxi

14

Sie sollen nicht em.getTransaction().begin(); noch em.getTransaction().commit(); verwenden, sind diese Anweisungen mit RESOURCE_LOCAL Transaktionstyp verwendet werden.

In Ihrem Fall wird die Transaktion vom Container verwaltet, bei der ersten Verwendung der EntitiyManager in Ihrer Methode überprüft der Container, ob es eine aktive Transaktion gibt oder nicht, wenn keine Transaktion aktiv ist, dann erstellt sie eine, und Wenn der Methodenaufruf endet, wird die Transaktion vom Container festgeschrieben. Also, am Ende Ihrer Methode sollte wie folgt aussehen:

public void save(User user) { 
    em.persist(user); 
} 

Der Behälter kümmert sich um die Transaktion, dh JTA.