2

Hibernateは、いくつかのことに非常に役立ちます。しかし、些細なことは注目の的ではありません。「管理パネル」でデータベースエントリを変更する方法を提供したいと思います。具体的には、商品、そのプロパティ、画像、価格などを変更できるビューが必要です。このため、たとえば、セッションを介して変更する商品の編集ビューを読み込みます。 .get(Product.class、id)。次に、そのプロパティを操作し、名前を変更し、価格を設定し、画像を読み込み、その他必要なことを行います。ただし、最後に、ユーザーは変更を保存するか破棄するかを決定する必要があります。パーツの保存は簡単です。サービスレイヤーでトランザクションを使用してsession.saveを呼び出しますが、その後のセッションフラッシュでは、キャンセルされた製品の変更がデータベースに伝播されるため、破棄は難しい問題のようです。

だから、私の質問は、そのようなスキームをどのように設定するかです。これに対する最善の策は何ですか?私は個人的に次の解決策を見ています:

  1. カスケードまたはでsession.evict()を呼び出す
  2. 複製されたコピー/DTOを使用し、保存アクションでマージするか、
  3. クライアントですべての変更を処理してから、保存時にHibernateエンティティにデータを入力し直します。
4

1 に答える 1

3

実際、私は、Hibernateの永続性ライフサイクルの誤解から生じた基本的なHibernateの機能を台無しにしました。

したがって、採用される一般的なアプローチの1つは、(1)メソッドを呼び出してエンティティをロードしdao.load(key)、関連付けられたセッションを閉じてセッションから切り離し、ユーザーに処理する時間を提供すること、(2)プレゼンテーション層で切り離されたエンティティを変更することです。ユーザーが作成し、(3)後で切り離されたオブジェクトを新しいセッションに再接続して、オブジェクトを再び永続化し、必要に応じて、オブジェクトをマージして、を呼び出しdao.merge(object)ます。もちろん、異なるプログラム層に干渉しないようにDTOを使用することもできます。

同じく賢明な別のアプローチは、1つのセッションまたはトランザクション内の永続オブジェクトを処理することです。この場合、変更をキャンセルするには、オブジェクトをセッションから削除するか、トランザクション全体session.evict()をロールバックしtransaction.rollback()ます。

私のような人がそのような誤解に遭遇した場合、私の参照リストは次のようになります。

  1. オブジェクトの状態に関するHibernateドキュメント;
  2. 永続コンテキストに関するHibernateドキュメントまたは
  3. slidreshareに関する優れた休止状態のレビュープレゼンテーション
于 2012-12-16T11:43:54.973 に答える