Hibernateのデタッチされた永続的な一時オブジェクトとは何ですか?


100

Hibernateのデタッチされた永続的な一時オブジェクトとは何ですか?例を挙げて説明してください。


session.closeで、セッションスコープで永続化されていたすべてのオブジェクトが削除されませんか?
Jigar Joshi、2010

はい、削除されます。そのため、セッションを閉じるたびに、オブジェクトの永続的な状態が切り離された状態に変換されます。
レイチェル

より深い理解のためのコードが提供された@Rachelの素敵なリンク
Priyank Thakkar 2017年

回答:


161

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

これでcloseHibernateを実行するSessionと、永続インスタンスは分離されたインスタンスになります。これはSessionもうアタッチされていません(ただし、Session後で変更して新しいインスタンスに再アタッチすることはできます)。

これはすべて、第10章全体で明確に説明されています。私が上記で言い換えただけのHibernateドキュメントのオブジェクトの操作。間違いなく、必読です。


割り当てられた識別子の生成戦略を使用できるため、識別子の値は、オブジェクトが永続的であるための厳密な条件ではない可能性があります。
Abhijeet Kashnia 2010

インスタンスを読み込んだセッションを閉じるだけでなく、session.evict()を呼び出してインスタンスをデタッチすることもできます。これにより、Hibernateによる管理から削除されます(そのため、インスタンスへの変更が自動的にdbに反映されるのを防ぎます)。session.update()を介してdbに変更を送信し、session.merge()を使用して再アタッチできます。
Mooshu 2013年

1
多くの場合、フレームワークによって提供される元のドキュメントをたどることはありません。それ自体が、適切な説明を持つ隠された情報を含むことがあるので、探索するだけです。唯一の問題は、簡単に見つけられないことです:)
agpt

A persistent instance has a representation in the database永続エンティティは、保存操作をコミットする前のデータベースで表現されていません。
O.Badr 2017年

1
したがって、分離されたエンティティと一時的なエンティティの違いは、IDの存在ですか?IDが割り当てられた新しいインスタンスを作成すると、正式には一時的なものになります。これは、まだ永続化されていないためですが、IDがあるため、分離されたインスタンスと区別できません。正しい?
Ruslan Stelmachenko 2018年

9

休止状態のオブジェクトには次の状態があります。

一時的-new演算子を使用してインスタンス化されたオブジェクトは一時的オブジェクトと呼ばれます。

オブジェクトは、new演算子を使用してインスタンス化されたばかりで、Hibernateセッションに関連付けられていない場合、一時的です。データベースには永続的な表現がなく、識別子の値は割り当てられていません。アプリケーションが参照を保持しなくなった場合、一時インスタンスはガベージコレクターによって破棄されます。

永続的-データベースIDが関連付けられているオブジェクトは、永続的オブジェクトと呼ばれます。

永続インスタンスには、データベース内の表現と識別子の値があります。単に保存またはロードされた可能性があります。ただし、これは定義によりセッションのスコープ内にあります。Hibernateは永続状態のオブジェクトに加えられた変更を検出し、作業ユニットが完了するとその状態をデータベースと同期します。

デタッチ-デタッチされたインスタンスは永続的なオブジェクトですが、そのセッションは閉じられています。

デタッチされたインスタンスは、後で新しいセッションに再接続して、永続化することができます。この機能により、ユーザーの思考時間を必要とする長時間実行される作業単位のプログラミングモデルが可能になります。これらをアプリケーショントランザクション、つまりユーザーの視点から見た作業の単位と呼びます。

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012


5

ガベージコレクタの観点でも説明させてください。

hibernate(または)hibernateのObject Scopeには、3つのオブジェクト状態があります。

  1. 過渡状態
  2. 永続的な状態
  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から簡単に消去できます)


2

次のエンティティがあるとします。

@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クラスを探索する価値があると思います。


0

正解のほかに、永続的、一時的、切り離されているのは、休止状態のオブジェクトの状態だけです。

より正確には、これらの3つの状態は、実際には休止状態のオブジェクトの変更とセッションのライフサイクルステータスを示しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.