2012-06-06 19 views
9

ja dostaję ten błąd:nie można używać EntityTransaction podczas korzystania JTA

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

Podczas próby użycia JPA i JavaEE GlassFish.

Mój plik persistence.xml jest następująca:

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

co próbuję zrobić, to utrzymują się obiektu (użytkownik), w ten sposób:

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

Chociaż jeśli to spróbuj użyć UserRepository z prostej aplikacji Java, działa poprawnie.

Dzięki z góry,

Odpowiedz

8

Jak stwierdza błędach, jeśli używasz JTA dla transakcji, trzeba użyć JTA.

Skorzystaj z JTA UserTransaction, aby rozpocząć/zatwierdzić transakcję, lub użyj jednostki trwałości RESOURCE_LOCAL i źródła danych non-jta.

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

+2

Wielkie dzięki, to zawstydzające, ale uznałem, że część kodu działa. Dzięki, – andreaxi

14

Nie powinno używać em.getTransaction().begin(); ani em.getTransaction().commit();, instrukcje te muszą być stosowane z RESOURCE_LOCAL typu transakcji.

W twoim przypadku transakcja jest zarządzana przez kontener, w pierwszym użyciu metody EntitiyManager w Twojej metodzie, kontener sprawdza, czy jest aktywna transakcja, czy nie, jeśli nie ma aktywnej transakcji, to tworzy ją, i po zakończeniu wywołania metody transakcja zostaje zatwierdzona przez kontener. Na koniec Twoja metoda powinna wyglądać następująco:

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

Kontener zajmuje się transakcją, czyli JTA.

Powiązane problemy