3

Seam JBoss Seam 2.2.2 Final Release を使用しており、Hibernate 3.3.1.GA が含まれています。テーブルで更新が発生すると、古いレコードが履歴テーブルに記録されるように、テーブルの更新にトリガーを配置しました。

エンティティに入力するフィールドを含むページがあります。フィールドが完了すると、必要に応じてエンティティを更新するメソッド (JSF 内) に対して AJAX 呼び出しが呼び出されます。問題は、Hibernate がエンティティが変更されたと見なし、それに応じて DB テーブルを更新することです。これにより、履歴テーブルが増加します。Hibernate を使用した JPA 実装のみを使用しています。

私の質問は次のとおりです。Hibernate で自動更新 (透過的永続性と呼ばれる) を無効にするにはどうすればよいですか? または(コード内) を呼び出して、エンティティを明示的に保存します。EntityManager.persist()EntityManager.merge()

ありがとう

4

2 に答える 2

1

あなたの質問に答えるには:

メソッドを終了する前に、メソッド内のエンティティを更新したり、entitymanager をクリアしたりしないでください。

あなたが必要だと思う答え:

個々の変更をデータベースに送信するのではなく、すべての変更を集約し、ユーザーが変更をコミットした後にのみ永続エンティティを更新します (たとえば、「保存」または「次へ」ボタンなど)。

于 2012-10-05T09:10:18.620 に答える
1

ページに関する会話を作成し、 を使用できますflush-mode="MANUAL"。これにより、明示的に実行するまで(persist()たとえば、メソッド内で)フラッシュが効果的に無効になります。

これの欠点は、手動フラッシュが標準の JPA 1.0 機能ではないため、Hibernate が永続化プロバイダーでなければならないことです。したがって、Seams は Hibernate でのみ使用方法を知っています。これは、少なくとも 2.2.x までの Seam バージョンに当てはまります。現在は Hibernate を使用しているため、これは問題になりません。

代替案:

  1. 実際のエンティティ オブジェクトの代わりに、ページで DTO オブジェクトを使用します。エンティティを DTO に複製し、永続化する前にエンティティを更新します。
  2. EntityManager.clear()セッションからすべてのオブジェクトを切り離すために使用します。
于 2012-10-05T10:13:46.867 に答える