web-dev-qa-db-ja.com

JTAの使用中はEntityTransactionを使用できません

私はこのエラーを受け取っています:

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

一方、単純なJava=アプリケーションからUserRepositoryを使用しようとすると、正しく動作します。

よろしくお願いいたします。AN

16
andreaxi

エラーが示すように、トランザクションにJTAを使用している場合は、JTAを使用する必要があります。

JTA UserTransactionを使用してトランザクションを開始またはコミットするか、RESOURCE_LOCAL永続性ユニットと非jta DataSourceを使用します。

参照 http://en.wikibooks.org/wiki/Java_Persistence/Transactions

16
James

em.getTransaction().begin();em.getTransaction().commit();を使用することはできません。これらの命令はRESOURCE_LOCALトランザクションタイプ。

あなたの場合、トランザクションはコンテナによって管理されます。メソッドでEntitiyManagerを初めて使用するときに、コンテナはアクティブなトランザクションがあるかどうかをチェックします。アクティブなトランザクションがない場合は、トランザクションを作成します。また、メソッド呼び出しが終了すると、トランザクションはコンテナによってコミットされます。したがって、最後にメソッドは次のようになります。

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

コンテナはトランザクション、つまりJTAを処理します。

18
Joe Almore