データベースからオブジェクトを取得する際のJPA(Hibernate)によるトランザクションの処理方法

StackOverflow https://stackoverflow.com/questions/245723

質問

現在、Hibernateを永続性マネージャーとして、JPAを永続性管理ハイバネートの抽象化として使用して、Javaでアプリケーションを開発しています。

結果クエリをトランザクションにラップすることの影響を知りたい。エンティティマネージャーは、遅延フェッチされたフィールドバグに対して開いたままにしておく必要があることを知っています。このすべてのトランザクションはどうですか?

これは、トランザクションのアクティブ化/非アクティブ化機能を備えたコード例です。

public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
    EntityTransaction tx = null;
    try {
        if (withTransaction) {
            tx = em.getTransaction();
            tx.begin();
        }

        Query query = em.createQuery("from Exportdata");
        query.setMaxResults(10);
        List<Exportdata> list = query.getResultList();

        if (withTransaction)
            tx.commit();

        return list;
    } catch (RuntimeException re) {
        if (withTransaction)
            if (tx != null && tx.isActive())
                tx.rollback();

        throw re;
    }
}

この関数が呼び出された場合のwithTransactionの有効化と無効化の違いは何ですか?

ありがとう、 フレッド

役に立ちましたか?

解決

データを変更していないので、ここでは実際的な違いはありません。実行するクエリは、SQL selectを生成します。トランザクションは、ACIDプロパティを挿入、更新などのコレクションに適用できるようにするためのものです。

ただし、このメソッドから返されたリスト内のオブジェクトの操作、セッターの呼び出しなどを開始すると、これらの変更はアドホックのトランザクションでデータベースに伝播されます基礎。言い換えれば、自動コミットモードでdbを効果的に使用できます。これはあなたが望むものではないでしょう。

理解すべき重要なことは、永続コンテキストとトランザクションの期間を個別に管理できることです。多くの場合、それらを一緒に管理したいでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top