Hibernateのデタッチされた永続的な一時オブジェクトとは何ですか?例を挙げて説明してください。
Hibernateのデタッチされた永続的な一時オブジェクトとは何ですか?例を挙げて説明してください。
回答:
にnew
関連付けられていない永続クラスのインスタンスはSession
データベースで表現されず、Hibernateによって識別子の値が一時的であると見なされません。
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
永続的なインスタンスは、データベース内の表現、識別子の値を有しており、関連付けられていますSession
。と関連付けることにより、一時インスタンスを永続化できますSession
。
Long id = (Long) session.save(person);
// person is now in a persistent state
これでclose
Hibernateを実行するSession
と、永続インスタンスは分離されたインスタンスになります。これはSession
もうアタッチされていません(ただし、Session
後で変更して新しいインスタンスに再アタッチすることはできます)。
これはすべて、第10章全体で明確に説明されています。私が上記で言い換えただけのHibernateドキュメントのオブジェクトの操作。間違いなく、必読です。
A persistent instance has a representation in the database
永続エンティティは、保存操作をコミットする前のデータベースで表現されていません。
休止状態のオブジェクトには次の状態があります。
一時的-new演算子を使用してインスタンス化されたオブジェクトは一時的オブジェクトと呼ばれます。
オブジェクトは、new演算子を使用してインスタンス化されたばかりで、Hibernateセッションに関連付けられていない場合、一時的です。データベースには永続的な表現がなく、識別子の値は割り当てられていません。アプリケーションが参照を保持しなくなった場合、一時インスタンスはガベージコレクターによって破棄されます。
永続的-データベースIDが関連付けられているオブジェクトは、永続的オブジェクトと呼ばれます。
永続インスタンスには、データベース内の表現と識別子の値があります。単に保存またはロードされた可能性があります。ただし、これは定義によりセッションのスコープ内にあります。Hibernateは永続状態のオブジェクトに加えられた変更を検出し、作業ユニットが完了するとその状態をデータベースと同期します。
デタッチ-デタッチされたインスタンスは永続的なオブジェクトですが、そのセッションは閉じられています。
デタッチされたインスタンスは、後で新しいセッションに再接続して、永続化することができます。この機能により、ユーザーの思考時間を必要とする長時間実行される作業単位のプログラミングモデルが可能になります。これらをアプリケーショントランザクション、つまりユーザーの視点から見た作業の単位と呼びます。
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
ガベージコレクタの観点でも説明させてください。
hibernate(または)hibernateのObject Scopeには、3つのオブジェクト状態があります。
コード例で理解することをお勧めします-
POJOクラスをStudent Object->と見なしてみましょう
Student student = new Student();
現在、この生徒オブジェクトは一時的な状態です。
このPOJOオブジェクトをhibernateセッションにアタッチすると->
session.save(student);
これで、このPOJOオブジェクトは永続的な状態になります。
(ガベージコレクターの観点-GCは永続状態にあるオブジェクトをワイプアウトできません。永続状態はPOJOオブジェクトの一時ストレージのようなものだと言えます)
行う場合->
session.beginTransaction.commit();
その後、POJOオブジェクトは永続的またはデータベースのストレージ状態になります
(ガベージコレクターの観点-このPOJOオブジェクトは現在JVMのスコープ外にあり、データベース内のフォームテーブルに格納されているため、GCはこのオブジェクトを一掃できません。このデータベースストレージの状態は、POJOの永続的なストレージのようであると言えます。オブジェクト)
行う場合->
session.evict(student);
その後、POJOオブジェクトは永続的な状態から切り離された状態または切り離された状態に戻されます。この状態のPOJOオブジェクトは切り離された状態です。
(ガベージコレクターの観点-GCは切り離された状態のPOJOオブジェクトをJVMから簡単に消去できます)
次のエンティティがあるとします。
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
Hibernate 5.2のドキュメントから(removed
状態も含めました):
一時的な
エンティティはインスタンス化されたばかりであり、永続化コンテキストに関連付けられていません。データベースに永続的な表現はなく、通常、識別子の値は割り当てられていません(割り当てられたジェネレーターが使用された場合を除く)。
City city = new City();
管理、または永続的
エンティティには識別子が関連付けられ、永続化コンテキストに関連付けられています。データベースに物理的に存在する場合と存在しない場合があります。
// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);
一戸建て
エンティティには関連付けられた識別子がありますが、永続コンテキストに関連付けられていません(通常、永続コンテキストが閉じられたか、インスタンスがコンテキストから削除されたためです)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
削除された
エンティティには識別子が関連付けられ、永続化コンテキストに関連付けられていますが、データベースからの削除がスケジュールされています。
session.remove(city);
注:
Hibernate APIはエンティティの状態を切り替えるためのいくつかのメソッドを提供します。私はHibernate Sessionクラスを探索する価値があると思います。
正解のほかに、永続的、一時的、切り離されているのは、休止状態のオブジェクトの状態だけです。
より正確には、これらの3つの状態は、実際には休止状態のオブジェクトの変更とセッションのライフサイクルステータスを示しています