Hibernate Merging and Refreshing Entities

前のチュートリアルでは、hibernateでsave()またはsaveOrUpdate()メソッドを使用してエンティティを保存することについて学びました。 そこでは、ほとんどの場合、hibernateが永続エンティティの更新を自動的に管理するので、これらのメソッドさえ必要ないことを学びました。 ほとんどの場合、一時的なオブジェクトだけを気にする必要があります。 このチュートリアルでは、hibernate sessionクラスに存在するrefresh()merge()メソッドに関するいくつかの考えについて説明しています。

refresh()メソッドを使用してHibernateエンティティを更新する

アプリケーションデータベースが外部アプリケーション/エージェントで変更され、アプリケーション内の対応するhibernateエンティティが実際にデータベース表現と同期しなくなる、つまり古いデータがあるという状況に直面することがあります。 この場合、session.refresh()メソッドを使用して、データベースで使用可能な最新のデータをエンティティに再入力できます。

次のように、Sessionインターフェイスでrefresh()メソッドのいずれかを使用して、永続オブジェクトのインスタンスを更新できます:

public void refresh(Object object) throws HibernateExceptionpublic void refresh(Object object, LockMode lockMode) throws HibernateException

これらのメソッドは、オブジェクトのプロパティをデータベースからリロードし、上書きします。 実際のアプリケーションでは、上記のシナリオを除いて、refresh()メソッドを頻繁に使用する必要はありません。

refresh()メソッドの例を見てみましょう。

強調表示された行の上を見てください。

  • 15行目”Lokesh”という名前の従業員を保存します
  • 26行目”Vikas”という名前を設定します。 エンティティがデタッチされると、DBは更新されません。
  • 27行目refresh()メソッドを使用してデータベースを使用してエンティティを更新します。
  • 32行目エンティティに設定されたfirstnameが”Lokesh”で更新されていることを確認します。

これはすべてrefreshメソッドに関するものでした。 別の同様の方法merge()を見てみましょう。

merge()メソッド

メソッドmerge()を使用してHibernateエンティティをマージすることは、refresh()が行うこととは正反対です。 Refreshメソッドは、最新のデータベース情報を使用してエンティティを更新していました。 だから、基本的には、両方が正反対です。

マージは、デタッチされたエンティティを永続状態に再度変更し、デタッチされたエンティティの変更をデータベースに移行(または上書き)する場合に実行 マージ操作のメソッドシグネチャは次のとおりです:

Object merge(Object object)Object merge(String entityName, Object object)

Hibernateの公式ドキュメントは、merge()メソッドの非常に良い説明を与えます:

与えられたオブジェクトの状態を同じ識別子を持つ永続オブジェクトにコピーし セッションに現在関連付けられている永続インスタンスがない場合は、そのインスタンスがロードされます。 永続インスタンスを返します。 指定されたインスタンスが保存されていない場合は、そのコピーを保存し、新たに永続インスタンスとして返します。 指定されたインスタンスはセッションに関連付けられません。 この操作は、関連付けがcascade=”merge”でマップされている場合、関連するインスタンスにカスケードします。だから私が例えば以下のコードを取るならば、以下の点はあなたに明確でなければなりません。

EmployeeEntity mergedEmpEntity = session.merge(empEntity);
  • ‘empEntity’は、merge()メソッドに渡されるときに分離されたエンティティです。
  • merge()メソッドは、empEntityから取得された識別子情報を持つ既にロードされたEmployeeEntityインスタンスを検索します。 このような永続エンティティが見つかった場合、それは更新に使用されます。 他の賢明な新しいEmployeeEntityは、’empEntity’に存在するのと同じ識別子情報を使用してセッションにロードされます。
  • データが’empEntity’から新しい検出/ロードされたエンティティにコピーされます。
  • new/foundエンティティは永続的であるため、’empEntity’からコピーされたすべてのデータは自動的にデータベースに保存されます。
  • その新しいエンティティの参照はmerge()メソッドから返され、’mergedEmpEntity’変数に割り当てられます。
  • ‘empEntity’はまだ分離されたエンティティです。上記の例では、’mergedPersistentEmpEntity’は永続的な新しいエンティティです。 したがって、これ以上変更したい場合は、’mergedPersistentEmpentity’インスタンスに入れてください。

    このチュートリアルでは、hibernateのmerge()refresh()メソッドをカバーしています。 その質問は、merge()refresh()の違い、またはmerge()load()の違いなどとして尋ねることができます。 面接の質問の間にそのような違いが発生する準備ができています。

    幸せな学び!!

    この投稿は役に立ちましたか?

    あなたが投稿を好きなら私たちに知らせてください。 それが私たちが改善できる唯一の方法です。
    はい
    いいえ

前のチュートリアルでは、hibernateでsave()またはsaveOrUpdate()メソッドを使用してエンティティを保存することについて学びました。 そこでは、ほとんどの場合、hibernateが永続エンティティの…

前のチュートリアルでは、hibernateでsave()またはsaveOrUpdate()メソッドを使用してエンティティを保存することについて学びました。 そこでは、ほとんどの場合、hibernateが永続エンティティの…

コメントを残す

メールアドレスが公開されることはありません。