1

私には実体があります。このエンティティは、トランザクション内で変更されます。しかし、ある時点で、トランザクション中に行われたこのエンティティへの変更を知りたいと思っています。その理由は、エンティティへの変更の差分エクスポートをトリガーするためです。私はすでにこの「ソリューション」を開発しました:

public void triggerExport(A a)
{
    em.detach(a);
    A result = em.find(A.class, a.internId);

    doExport(a, result);
    em.merge(a);

}

これが実際にこれを行うための実際的な方法であるかどうかはわかりません。このエンティティを比較するたびに、追加のデータベース インタラクションが発生します。どう思いますか?より良い方法はありますか?

4

3 に答える 3

3

新しい EntityManager を作成してオブジェクトを見つけることもできます。これにより、オブジェクトのデタッチとマージを節約できます。

EclipseLink を使用している場合は、EntityManager から UnitOfWork をアンラップし、getCurrentChanges() を呼び出して、トランザクションで行われた変更の変更セットを取得できます。共有キャッシュを使用している場合は、getOriginalVersionOfObject() を使用して元のオブジェクトを取得することもできます。

EclipseLink には、完全な履歴サポートもあります。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Historyを参照

于 2012-06-19T14:46:56.710 に答える
2

私はこれを個人的に使用したことはありませんが、Hibernate と統合された監査ツールであるJBoss Enversについて良いことを聞きました。これを使用して、エンティティの変更内容を監査し、特定の変更をエクスポートできます。

于 2012-06-19T12:58:39.460 に答える
0

Hibernateを使用する場合、デフォルトでは、第1レベルのキャッシュを使用して、デフォルトで同じセッションで行われる繰り返し可能なクエリをキャッシュします。

冬眠レシピから:問題解決アプローチの本

第1レベルのキャッシュは、トランザクションレベルまたは作業単位にあります。Hibernateではデフォルトで有効になっています。最初のレベルでのキャッシングは、セッションに関連付けられています。同じセッションで同じクエリが複数回実行された場合、クエリに関連付けられたデータがキャッシュされます。

セッション内でオブジェクトを複数回取得するとします。Hibernateはクエリが呼び出された回数だけデータベースにクエリを実行しますか?

Session session = factory.openSession();
try {
Book book1 = (Book) session.get(Book.class, id);
Book book2 = (Book) session.get(Book.class, id);
} finally {
session.close();
}

Hibernateによって実行されるSQLステートメントを調べると、データベースクエリが1つだけ実行されていることがわかります。これは、Hibernateが同じセッションでオブジェクトをキャッシュしていることを意味します。この種のキャッシングは第1レベルのキャッシングと呼ばれ、そのキャッシングスコープはセッションです。

于 2012-06-19T12:33:44.133 に答える