0

私は現在、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 の有効化と無効化の違いは何ですか?

ありがとう、フレッド

4

1 に答える 1

5

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

ただし、このメソッドから返されたリスト内のオブジェクトの操作を開始したり、setter を呼び出したりすると、それらの変更は、アドホック ベースでトランザクションを使用してデータベースに反映されます。つまり、自動コミット モードでデータベースを効率的に操作できます。これはあなたが望むものである可能性は低いです。

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

于 2008-10-29T10:44:12.550 に答える