Не удается использовать EntityTransaction при использовании JTA

Я получаю эту ошибку:

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

при попытке использовать JPA и JAVAEE, Glassfish.

мою настойчивость.XML-файл выглядит следующим образом:

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

то, что я пытаюсь сделать, это сохранить объект (пользователь), таким образом:

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

хотя, если он пытается использовать UserRepository из простого приложения Java, он работает правильно.

спасибо заранее, АН

2 ответов


Как говорится в сообщении об ошибке, если вы используете JTA для транзакций, вам нужно использовать JTA.

либо используйте JTA UserTransaction для начала / фиксации транзакции, либо используйте RESOURCE_LOCAL единицу персистентности и источник данных, отличный от JTA.

посмотреть, http://en.wikibooks.org/wiki/Java_Persistence/Transactions


вы не должны использовать em.getTransaction().begin();, ни em.getTransaction().commit();, эти инструкции должны использоваться с RESOURCE_LOCAL тип транзакции.

в вашем случае транзакция управляется контейнером, при первом использовании EntitiyManager в вашем методе контейнер проверяет, есть ли активная транзакция или нет, если нет активной транзакции, то он создает ее, и когда вызов метода заканчивается, транзакция фиксируется контейнером. Итак, в конце ваш метод должен выглядеть так это:

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

контейнер заботится о транзакции, то есть JTA.