0

次のコードがあります。

package testingjpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class Main
{

    public static void main(String[] args)
    {
        EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("TestingJPAPU");

        EntityManager em = emFactory.createEntityManager();

        Query query = em.createQuery("UPDATE Passengers p SET p.name = 'Robert' WHERE p.id = 2");

        query.executeUpdate();
        em.close();
    }
}

このコードの問題は、TransactionRequiredException をスローしていることです。他のコードを使用してみましたが、完全に機能したため、エンティティ クラスは正常に機能します。どうすればこの問題を解決できますか?

4

2 に答える 2

3

コンテナ管理のトランザクションはこの状況では使用できないため、自分でトランザクションを開始してコミット/ロールバックする必要があります。

最初に、EntityManager から UserTransaction を要求する必要があります。クエリの後、トランザクションをコミットまたはロールバックする必要があります。

また、まともな接続処理を行う必要があります。コードから例外がスローされたときにリソースリークが発生するのを回避するために、finally ブロックでエンティティマネージャーを閉じます。

于 2013-01-31T14:26:45.870 に答える
1
@Resource private UserTransaction mytx;
public static void main(String[] args)
    {
        EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("TestingJPAPU");

        EntityManager em = emFactory.createEntityManager();

        mytx.begin();
        Query query = em.createQuery("UPDATE Passengers p SET p.name = 'Robert' WHERE p.id = 2");

        query.executeUpdate();
        mytx.commit()
        em.close();
    }
于 2013-01-31T14:22:30.090 に答える