Не може да се използва EntityTransaction, докато се използва JTA

Получавам тази грешка:

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

Докато се опитвате да използвате JPA и JAVAEE, Glassfish.

Моят файл persistence.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 приложение, работи правилно.

Благодаря предварително, AN


person andreaxi    schedule 06.06.2012    source източник


Отговори (2)


Както гласи грешката, ако използвате JTA за транзакции, трябва да използвате JTA.

Или използвайте JTA UserTransaction, за да започнете/изпълните транзакцията, или използвайте RESOURCE_LOCAL единица за постоянство и не-jta DataSource.

Вижте http://en.wikibooks.org/wiki/Java_Persistence/Transactions

person James    schedule 06.06.2012
comment
Благодаря много, смущаващо е, но смятах, че тази част от кода работи. Благодаря, - person andreaxi; 06.06.2012

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

Във вашия случай транзакцията се управлява от контейнера, при първото използване на EntitiyManager във вашия метод, контейнерът проверява дали има активна транзакция или не, ако няма активна транзакция, той създава такава и когато извикването на метода приключва, транзакцията се извършва от контейнера. И така, в крайна сметка вашият метод трябва да изглежда така:

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

Контейнерът се грижи за транзакцията, тоест JTA.

person Joe Almore    schedule 12.02.2014