Hibernate におけるオブジェクトの 3 つの状態とそれらの相互変換
休止状態のオブジェクトには 3 つの状態があります: 一時状態 (一時的)、永続状態 (永続)、デタッチ状態 (分離)
1. 一時状態 (Transient)
Java の new キーワードを通じてエンティティ オブジェクトを生成すると、エンティティ オブジェクトは次のようにフリー状態になります:
Customer customer=new Customer(“zx”,27,images);
この時点で、顧客オブジェクトはフリー状態にあり、 customer オブジェクトがフリー状態であると言われるのはなぜですか?これは、現時点では顧客は JVM を通じてメモリ領域の一部を取得しているだけであり、Session オブジェクトの save() メソッドを通じてデータベースに保存されていないためです。したがって、それはまだ Hibernate の中に含まれていません。キャッシュ管理。これは、顧客オブジェクトが Hibernate キャッシュ管理の外で自由にローミングできることを意味します。したがって、フリーオブジェクトの最大の特徴は、データベース内にそれに対応するレコードが存在しないことであることがわかります。
一時オブジェクトの特徴:
(1) セッションインスタンスに関連付けられていません
(2) データベース内に一時オブジェクトに関連付けられたレコードがありません
2。 Persistent (永続)
永続オブジェクトはデータベースに保存されたエンティティ オブジェクトであり、このエンティティ オブジェクトは依然として Hibernate のキャッシュ管理下にあります。このエンティティ オブジェクトに対する変更は、キャッシュがクリアされるときにデータベースに同期されます。以下に示すように:
Customer customer=new Customer(“zx”,27,images); tx=session.beginTransaction(); session.save(customer); customer=(Customer)session.load(Customer.class,”1”); customer.setAge(28); tx.commit();
この時点では、更新を保存するために session.update() メソッドを明示的に呼び出していませんが、エンティティ オブジェクトへの変更は引き続きデータベースに同期的に更新されます。オブジェクトは save メソッドによってデータベースに保存され、すでに永続オブジェクトになっていますが、load メソッドによって再度ロードされます。そのため、この時点ではまだ Hibernate キャッシュの管理下にあります。 tx.commit() メソッドが実行されると、Hibernate はキャッシュを自動的にクリーンアップし、永続オブジェクトのプロパティの変更をデータベースに自動的に同期します。
永続インスタンスはデータベース内に対応するレコードを持ち、永続オブジェクトは常にセッションとトランザクションに関連付けられます。セッションでは、永続オブジェクトへの変更はすぐには反映されません。データベースは変更される必要があります。また、トランザクションが終了した後、つまり commit() が実行された後、変更を加えるにはデータベース内で SQL を実際に実行する必要があり、永続オブジェクトの状態はデータベースと同期されます。同期前の永続オブジェクトはダーティ オブジェクトと呼ばれます。
一時オブジェクトを永続オブジェクトに変換します:
(1)
Session の save() および saveOrUpdate() メソッドを通じて一時オブジェクトをデータベースに関連付けると、この一時オブジェクトは永続オブジェクトになります。 (2)
fine()、get()、load()、および iterater() メソッドを使用してクエリされたデータ オブジェクトは永続オブジェクトになります。 永続オブジェクトの特徴:
(1)
はSessionインスタンス(2)
に関連付けられていますデータベースには永続オブジェクトに関連付けられたレコードがあります
3。デタッチ状態 (Detached) 永続オブジェクトが Hibernate のキャッシュ管理から離脱すると、フリー状態になります。 フリー オブジェクトとフリー オブジェクトの最大の違いは、フリー オブジェクトには別のパスが存在する可能性があることです。データベース内のそれに対応するレコードは、このフリー オブジェクトが Hibernate のキャッシュ管理の外にあるだけであり、フリー オブジェクトはデータベース内に対応するデータ レコードを持ちません。以下に示すように:
Customer customer=new Customer(“zx”,27,images); tx=session.beginTransaction(); session.save(customer); customer=(Customer)session.load(Customer.class,”1”); customer.setAge(28); tx.commit(); session.close();
セッションが閉じられると、顧客オブジェクトは Hibernate のキャッシュ管理から外れますが、この時点ではデータベース内に顧客オブジェクトに対応するデータ レコードがまだ存在するため、顧客オブジェクトはこの時点ではフリー状態です
永続オブジェクトに関連付けられたセッションが閉じられると、オブジェクトは切り離されたオブジェクトになります。切り離されたオブジェクトへの参照は有効なままであり、オブジェクトは引き続き変更できます。
分離されたオブジェクトの特徴:
(1)
本質的には一時オブジェクトと同じ (2) 只是比爱瞬时对象多了一个数据库记录标识值 id. 持久对象转为脱管对象: 当执行 close() 或 clear(),evict() 之后,持久对象会变为脱管对象。 瞬时对象转为持久对象: 通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把脱管对象变为持久对象。 三种状态相互转化的状态图如下: 4 .结合 save(),update(),saveOrUpdate() 方法说明对象的状态 (1)Save() 方法将瞬时对象保存到数据库,对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直位于 Session 的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用 save()或 update() 方法是没有意义的。如: (2)update() 方法两种用途重新关联脱管对象为持久化状态对象,显示调用 update() 以更新对象。调用 update() 只为了关联一个脱管对象到持久状态,当对象已经是持久状态时,调用 update() 就没有多大意义了。如: Hibernate 总是执行 update 语句,不管这个脱管对象在离开 Session 之后有没有更改过,在清理缓存时 Hibernate总是发送一条 update 语句,以确保脱管对象和数据库记录的数据一致,如: 注:即使把 session2.update(stu); 这句去掉,提交事务时仍然会执行一条 update() 语句。 如果希望只有脱管对象改变了, Hibernate 才生成 update 语句,可以把映射文件中 (3)saveOrUpdate() 方法兼具 save() 和 update() 方法的功能,对于传入的对象, saveOrUpdate() 首先判断其是脱管对象还是临时对象,然后调用合适的方法。 以上就是Hibernate中对象的三种状态及相互转化的内容,更多相关内容请关注PHP中文网(www.php.cn)!Student stu = new Strudnet();
stu.setCarId(“200234567”);
stu.setId(“100”);
// 打开 Session, 开启事务
session.save(stu);
stu.setCardId(“20076548”);
session.save(stu); // 无效
session.update(stu); // 无效
// 提交事务,关闭 Session
// 打开 session ,开启事务
stu = (Student)session.get(Student.class,”123456”);
stu.setName(“Body”);
session.update(stu); // 由于 stu 是持久对象,必然位于 Session 缓冲中,
对 stu 所做的变更将 // 被同步到数据库中。所以 update() 是没有意义的,可以不要这句效果一样的。
// 提交事务,关闭 Session
Student stu = new Strudnet();
stu.setCarId(“1234”);
// 打开 Session1, 开启事务
session1.save(stu);
// 提交事务,关闭 Session1
stu.set(“4567”); // 对脱管对象进行更改
// 打开 Session2, 开启事务
session2.update(stu);
// 提交事务,关闭 Session2

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JSON (JavaScriptObjectNotation) は、Web アプリケーション間のデータ交換の一般的な形式となっている軽量のデータ交換形式です。 PHP の json_encode() 関数は、配列またはオブジェクトを JSON 文字列に変換できます。この記事では、PHPのjson_encode()関数の構文、パラメータ、戻り値、具体的な例などの使い方を紹介します。構文 json_encode() 関数の構文は次のとおりです。

Wedge オブジェクトは主に 2 つの方法で作成されることがわかっています。1 つは Python/CAPI を使用する方法、もう 1 つは型オブジェクトを呼び出すことによる方法です。組み込み型のインスタンス オブジェクトについては、両方のメソッドがサポートされています。たとえば、リストは [] または list() を通じて作成できます。前者は Python/CAPI で、後者は呼び出し型オブジェクトです。ただし、カスタム クラスのオブジェクトの場合は、型オブジェクトを呼び出すことによってのみ作成できます。オブジェクトを呼び出すことができる場合、そのオブジェクトは呼び出し可能ですが、それ以外の場合は呼び出し可能ではありません。オブジェクトが呼び出し可能かどうかは、対応する型オブジェクトにメソッドが定義されているかどうかによって決まります。のように

MySQL クエリ結果の配列をオブジェクトに変換する方法は次のとおりです。 空のオブジェクト配列を作成します。結果の配列をループし、行ごとに新しいオブジェクトを作成します。 foreach ループを使用して、各行のキーと値のペアを新しいオブジェクトの対応するプロパティに割り当てます。新しいオブジェクトをオブジェクト配列に追加します。データベース接続を閉じます。

Python の __contains__() 関数を使用して、オブジェクトの包含操作を定義します。Python は、さまざまな種類のデータを処理するための多くの強力な機能を提供する、簡潔で強力なプログラミング言語です。その 1 つは、__contains__() 関数を定義してオブジェクトの包含操作を実装することです。この記事では、__contains__() 関数を使用してオブジェクトの包含操作を定義する方法とサンプル コードを紹介します。 __contains__() 関数は Pytho です

SpringBoot プロジェクトへの Hibernate の統合 はじめに Hibernate は、Java オブジェクトをデータベース テーブルにマップして永続化操作を容易にする、人気のある ORM (オブジェクト リレーショナル マッピング) フレームワークです。 SpringBoot プロジェクトでは、Hibernate を統合すると、データベース操作をより簡単に実行できるようになります。この記事では、SpringBoot プロジェクトに Hibernate を統合する方法と、対応する例を示します。 1.依存関係の導入pom.xml ファイルに次の依存関係を導入します: org.springframework.bootspring-boot-starter-data-jpam

PHP の Request オブジェクトは、クライアントからサーバーに送信される HTTP リクエストを処理するために使用されるオブジェクトです。 Request オブジェクトを通じて、リクエストを処理して応答するために、リクエスト メソッド、リクエスト ヘッダー情報、リクエスト パラメータなどのクライアントのリクエスト情報を取得できます。 PHP では、$_REQUEST、$_GET、$_POST などのグローバル変数を使用して、要求された情報を取得できますが、これらの変数はオブジェクトではなく配列です。リクエスト情報をより柔軟かつ便利に処理するために、次のことができます。

タイトル: Python の __le__() 関数を使用して 2 つのオブジェクト以下の比較を定義する Python では、特別なメソッドを使用してオブジェクト間の比較演算を定義できます。その 1 つは __le__() 関数で、以下の比較を定義するために使用されます。 __le__() 関数は Python のマジック メソッドであり、「以下」演算を実装するために使用される特別な関数です。小なり等しい演算子 (<=) を使用して 2 つのオブジェクトを比較すると、Python

PHP では、配列は順序付けられたシーケンスであり、要素はインデックスによってアクセスされます。オブジェクトは、new キーワードによって作成されたプロパティとメソッドを持つエンティティです。配列へのアクセスはインデックス経由で、オブジェクトへのアクセスはプロパティ/メソッド経由で行われます。配列値が渡され、オブジェクト参照が渡されます。
