2

Ehcacheが提供する第2レベルのキャッシュを備えたHibernateがあります。

私は、キャッシュされたコレクションを持つParentクラスをChild持っています。Parent.children

次のコードを実行すると:

Session session = DataSessionFactory.openSession();
Transaction tx = session.beginTransaction();
Parent parent = // load from Session
Child child = new Child();
child.setParent(parent);
session.saveOrUpdate(child);
session.flush();
session.refresh(parent);
tx.rollback();
session.close();

session = DataSessionFactory.openSession();
tx = session.beginTransaction();
parent = session.load(Parent.class, parent.getId());
System.out.println(parent.getChildren());

最後の行は例外で失敗し、Child存在しないものをロードしようとします。Child調査の結果、前のトランザクションで作成およびロールバックされたものをロードしようとしていることが理由であることがわかりました。

コレクションキャッシュが適切にクリアされるように、キャッシュを構成する、またはトランザクションをロールバックする正しい方法は何ですか?ロールバック時にすべてのコレクションキャッシュを削除したくありません。ありがとうございます。HibernateまたはEhcacheに最小限の影響でそれを実行させる方法を探しています。

4

1 に答える 1

0

Hibernateトランザクションマネージャーは非常に単純であり、あなたが説明したことから、このケースを処理していないようです。理由は単純です。そこにはたくさんのJTAプロバイダーがあるので、Hibernateはそれ自体でJTAを実装しようとはしていません。したがって、JBoss ASなどのアプリケーションサーバーを使用している場合は、HibernateとEHCacheを構成してJTAプロバイダーを使用できます。これにより、この状況を確実に処理できます。

また、エンティティは「フラッシュ」方式でキャッシュに入れられていると思います。したがって、JTAプロバイダーを使用したくない場合、およびこの「フラッシュ」が本当に必要でない限り、その部分を削除します。

于 2011-02-24T06:33:24.007 に答える