Estoy recibiendo este error:

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

Al intentar utilizar JPA y JAVAEE, Glassfish.

Mi persistence.xml el archivo es como sigue:

<?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 yo 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 se intenta utilizar UserRepository a partir de una sencilla aplicación Java, funciona correctamente.

Gracias de antemano,
UN

OriginalEl autor andreaxi | 2012-06-06

2 Comentarios

  1. 15

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

    Utilizar JTA UserTransaction a begin/commit de la transacción, o el uso de un RESOURCE_LOCAL unidad de persistencia y no jta origen de datos.

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

    Muchas gracias, es vergonzoso pero yo consideraba que parte del código de trabajo. Gracias,

    OriginalEl autor James

  2. 16

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

    En el caso de que la transacción es gestionada por el contenedor, en el primer uso de la EntitiyManager en su método, el contenedor comprueba si hay una transacción activa o no, si no hay ninguna transacción activa, entonces se crea uno, y cuando el método de terminar la llamada, la transacción se confirma por el contenedor. Así que, al final de su método debería tener este aspecto:

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

    El contenedor se ocupa de la transacción, que es la JTA.

    OriginalEl autor Joe Almore

Dejar respuesta

Please enter your comment!
Please enter your name here