18

次のエラーが表示されます。

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

4

2 に答える 2

25

これらの命令は、トランザクション タイプで使用する必要がem.getTransaction().begin();あります。em.getTransaction().commit();RESOURCE_LOCAL

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

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

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

于 2014-02-12T05:27:14.720 に答える
19

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

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

http://en.wikibooks.org/wiki/Java_Persistence/Transactionsを参照してください 。

于 2012-06-06T14:08:48.293 に答える