3

データベース内のエンティティの変更の履歴を保持する、Hibernateを使用した一般的に受け入れられている実証済みの方法はありますか?

かなりの数のオブジェクトを追跡する必要があり、オブジェクトへの変更を元に戻せるようにする必要があります。

hibernateのインターセプターを使用してみましたが、オブジェクトの古い状態は、を実行している場合にのみ使用できますmerge()。ほとんどの場合、私たちはそうしupdate()ますsaveOrUpdate()が...

現在、Guiceと一緒にwarp-persistにセッションを管理させています。

4

5 に答える 5

4

私はこれをインターセプターで行いました(EmptyInterceptorに基づいて独自に作成しました)。onFlushDirty()ですべての変更(マージ、保存、saveOrUpdate、削除)を取得できました。

私が使用したEmptyInterceptorのメソッド:

@Override
public boolean onFlushDirty(Object object, Serializable id,
    Object[] newValues, Object[] oldValues, String[] properties,
    Type[] types) throws CallbackException {

@Override
public boolean onSave(Object object, Serializable id, Object[] newValues,
    String[] properties, Type[] types) throws CallbackException {

@Override
public void onDelete(Object object, Serializable id, Object[] newValues,
    String[] properties, Type[] types) throws CallbackException {

onFlushDirty()で、エンティティの以前の状態を照会する必要がありました。

Connection c = sessionFactory.getCurrentSession().connection();
Session session = sessionFactory.openSession(c);

BaseEntity newBaseEntity = (BaseEntity) object;
BaseEntity oldBaseEntity = (BaseEntity) session.get(newBaseEntity.getClass(), newBaseEntity.getId());
于 2009-12-18T09:01:47.203 に答える
1

JBossenversはおそらくあなたが探しているものです。

Enversプロジェクトは、永続クラスの簡単な監査/バージョン管理を可能にすることを目的としています。あなたがしなければならないのは、あなたが監査したいあなたの永続的なクラスまたはそのプロパティのいくつかに@Auditedで注釈を付けることです。監査対象のエンティティごとに、エンティティに加えられた変更の履歴を保持するテーブルが作成されます。その後、多くの労力をかけずに履歴データを取得してクエリを実行できます。

Subversionと同様に、ライブラリにはリビジョンの概念があります。基本的に、1つのトランザクションは1つのリビジョンです(トランザクションが監査対象のエンティティを変更しなかった場合を除く)。リビジョンはグローバルであり、リビジョン番号があるため、そのリビジョンのさまざまなエンティティを照会して、そのリビジョンのデータベースの(部分的な)ビューを取得できます。日付のあるリビジョン番号を見つけることができ、逆に、リビジョンがコミットされた日付を取得することもできます。

于 2009-12-18T09:04:06.937 に答える
1

JBossのHibernateEnversは、おそらくあなたが探しているものです:

Enversプロジェクトは、永続クラスの簡単な監査/バージョン管理を可能にすることを目的としています。あなたがしなければならないのは、あなたが監査したいあなたの永続的なクラスまたはそのプロパティのいくつかに@Auditedで注釈を付けることです。監査対象のエンティティごとに、エンティティに加えられた変更の履歴を保持するテーブルが作成されます。その後、多くの労力をかけずに履歴データを取得してクエリを実行できます。

于 2009-12-18T09:04:25.637 に答える
1

JBossによって開発された自動バージョン管理および監査プロジェクトがあります:envers。これを使用することをお勧めします。以前は手動で監査を実装しましたが、より複雑なユースケースに取り組み始めると、非常に面倒になる可能性があります。

于 2009-12-18T09:06:14.623 に答える
0

私はまったく同じ問題を抱えていました。1つの方法は、新しい状態だけで行うのではなく、lock()前の状態を使用してから新しい状態を使用することです。merge()update()

次に、hibernateは前後を認識し、インターセプター/イベントリスナーで使用できます。

HTH。

于 2009-12-18T08:59:15.600 に答える