2012-06-06 25 views
9

estoy recibiendo este error:No se puede utilizar un EntityTransaction durante el uso de JTA

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

al intentar utilizar JPA y JavaEE, Glassfish.

Mi archivo persistence.xml es la siguiente:

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

lo que estoy tratando de hacer es persistir un objeto (usuario), de esta manera:

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

mientras que si intente utilizar UserRepository desde una simple aplicación Java, funciona correctamente.

Gracias de antemano, UN

Respuesta

8

Como los estados de error, si está usando JTA para las transacciones, es necesario utilizar JTA.

Utilice JTA UserTransaction para comenzar/confirmar la transacción o utilice una unidad de persistencia RESOURCE_LOCAL y un DataSource que no sea jta.

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

+2

Muchas gracias, es embarazoso, pero consideré que esa parte del código funcionaba. Gracias, – andreaxi

14

No se supone que el uso em.getTransaction().begin(); ni em.getTransaction().commit();, estas instrucciones son para ser utilizado con RESOURCE_LOCAL tipo de transacción.

En su caso, la transacción es administrada por el contenedor, en el primer uso de EntitiyManager en su método, el contenedor verifica si hay una transacción activa o no, si no hay transacción activa, entonces crea una, y cuando finaliza la llamada al método, el contenedor compromete la transacción. Así, al final de su método debería tener este aspecto:

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

El contenedor se encarga de la transacción, es decir JTA.

Cuestiones relacionadas