Heim Java javaLernprogramm Drei Zustände von Objekten im Ruhezustand und ihre gegenseitige Transformation

Drei Zustände von Objekten im Ruhezustand und ihre gegenseitige Transformation

Mar 02, 2017 am 11:22 AM

Objekte im Ruhezustand haben drei Zustände: transienter Zustand (Transient), persistenter Zustand (Persistent), losgelöster Zustand (Detached). )

1. Transienter Zustand (Transient)

Wenn wir ein Entitätsobjekt über das neue Schlüsselwort von Java generieren, befindet sich das Entitätsobjekt in einem freien Zustand, wie folgt:

 Customer customer=new Customer(“zx”,27,images);
Nach dem Login kopieren

Zu diesem Zeitpunkt befindet sich das Kundenobjekt in einem freien Zustand. Warum heißt es, dass sich das Kundenobjekt in einem freien Zustand befindet? Dies liegt daran, dass der Kunde zu diesem Zeitpunkt nur einen Teil des Speicherplatzes über die JVM erhalten hat und nicht über die save()-Methode des Session-Objekts in der Datenbank gespeichert wurde. Daher wurde dieser noch nicht in Hibernate aufgenommen Cache-Verwaltung, was bedeutet, dass das Kundenobjekt außerhalb der Hibernate-Cache-Verwaltung weiterhin frei verfügbar ist. Wir können also sehen, dass das größte Merkmal eines freien Objekts darin besteht, dass es in der Datenbank keinen entsprechenden Datensatz gibt.

Eigenschaften vorübergehender Objekte:

(1) Nicht mit Sitzungsinstanz verknüpft

(2) Es gibt keinen Datensatz, der vorübergehenden Objekten in der Datenbank zugeordnet ist

2. Persistent (Persistent)

Ein persistentes Objekt ist ein Entitätsobjekt, das in der Datenbank gespeichert wurde, und dieses Entitätsobjekt steht immer noch unter der Cache-Verwaltung von Hibernate. Alle Änderungen an diesem Entitätsobjekt werden mit der Datenbank synchronisiert, wenn der Cache geleert wird. Wie unten gezeigt:

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();
Nach dem Login kopieren

Zu diesem Zeitpunkt haben wir die Methode session.update() nicht explizit aufgerufen, um die Aktualisierung zu speichern, aber die Änderung am Entitätsobjekt wird weiterhin synchron in der Datenbank aktualisiert. Denn zu diesem Zeitpunkt ist das Kundenobjekt bereits ein persistentes Objekt, nachdem die Speichermethode es in der Datenbank gespeichert hat, und lädt es dann erneut über die Lademethode. Es ist immer noch ein persistentes Objekt und wird daher weiterhin verwaltet Wenn zu diesem Zeitpunkt die Methode tx.commit() ausgeführt wird, löscht Hibernate automatisch den Cache und synchronisiert die Eigenschaftsänderungen des persistenten Objekts automatisch mit der Datenbank.

Persistente Instanzen verfügen über entsprechende Datensätze in der Datenbank und eine Persistenzkennung.

Persistente Objekte sind in einer Sitzung immer mit einer Sitzung und einer Transaktion verknüpft, da sich Änderungen am persistenten Objekt nicht sofort ändern Stattdessen muss SQL tatsächlich in der Datenbank ausgeführt werden, um Änderungen vorzunehmen, nachdem die Transaktion beendet wurde, d. h. nachdem commit() ausgeführt wurde. Erst dann wird der Status des persistenten Objekts mit der Datenbank synchronisiert. Persistente Objekte vor der Synchronisierung werden als Dirty Objects bezeichnet.

Konvertieren Sie ein transientes Objekt in ein persistentes Objekt:

(1) Verknüpfen Sie ein transientes Objekt mit der Datenbank über die Methoden save() und saveOrUpdate() von Session. Dieses vorübergehende Objekt Das Objekt wird zu einem dauerhaften Objekt.

(2) Das mit den Methoden „fine()“, „get()“, „load()“ und „iterater()“ abgefragte Datenobjekt wird zu einem persistenten Objekt.

Eigenschaften persistenter Objekte:

(1) ist mit der Sitzungsinstanz

(2) in den Datenbankdatensätzen verknüpft im Zusammenhang mit persistenten Objekten

3. Getrennt

Wenn ein persistentes Objekt aus der Cache-Verwaltung von Hibernate ausbricht, befindet es sich in einem freien Zustand. Der größte Unterschied zwischen einem freien Objekt und einem freien Objekt ist das freie Objekt Möglicherweise gibt es noch einen entsprechenden Datensatz in der Datenbank, aber jetzt befindet sich dieses freie Objekt außerhalb der Cache-Verwaltung von Hibernate und das freie Objekt verfügt nicht über den entsprechenden Datensatz in der Datenbank. Wie unten gezeigt:

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();
Nach dem Login kopieren

Wenn die Sitzung geschlossen ist, befindet sich das Kundenobjekt nicht mehr in der Cache-Verwaltung von Hibernate, aber zu diesem Zeitpunkt gibt es noch einen Datensatz, der dem Kundenobjekt in der Datenbank entspricht this Wenn sich das Kundenobjekt in einem freien Zustand befindet

Nachdem die mit dem persistenten Objekt verknüpfte Sitzung geschlossen wurde, wird das Objekt zu einem getrennten Objekt. Verweise auf losgelöste Objekte bleiben gültig und das Objekt kann weiterhin geändert werden.

Merkmale losgelöster Objekte:

(1) Im Wesentlichen die gleichen wie transiente Objekte

(2) 只是比爱瞬时对象多了一个数据库记录标识值 id.

持久对象转为脱管对象:

当执行 close() 或 clear(),evict() 之后,持久对象会变为脱管对象。

瞬时对象转为持久对象:

通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把脱管对象变为持久对象。

三种状态相互转化的状态图如下:

Drei Zustände von Objekten im Ruhezustand und ihre gegenseitige Transformation

4 .结合 save(),update(),saveOrUpdate() 方法说明对象的状态

(1)Save() 方法将瞬时对象保存到数据库,对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直位于 Session 的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用 save()或 update() 方法是没有意义的。如:

Student stu = new Strudnet();
stu.setCarId(“200234567”);
stu.setId(“100”);
// 打开 Session, 开启事务
session.save(stu);
stu.setCardId(“20076548”);
session.save(stu); // 无效
session.update(stu); // 无效
// 提交事务,关闭 Session
Nach dem Login kopieren


(2)update() 方法两种用途重新关联脱管对象为持久化状态对象,显示调用 update() 以更新对象。调用 update() 只为了关联一个脱管对象到持久状态,当对象已经是持久状态时,调用 update() 就没有多大意义了。如:

// 打开 session ,开启事务 
stu = (Student)session.get(Student.class,”123456”);
stu.setName(“Body”);
session.update(stu); // 由于 stu 是持久对象,必然位于 Session 缓冲中,
对 stu 所做的变更将 // 被同步到数据库中。所以 update() 是没有意义的,可以不要这句效果一样的。
// 提交事务,关闭 Session
Nach dem Login kopieren


Hibernate 总是执行 update 语句,不管这个脱管对象在离开 Session 之后有没有更改过,在清理缓存时 Hibernate总是发送一条 update 语句,以确保脱管对象和数据库记录的数据一致,如:

Student stu = new Strudnet();
stu.setCarId(“1234”);
// 打开 Session1, 开启事务
session1.save(stu);
// 提交事务,关闭 Session1
stu.set(“4567”); // 对脱管对象进行更改
// 打开 Session2, 开启事务
session2.update(stu);
// 提交事务,关闭 Session2
Nach dem Login kopieren


注:即使把 session2.update(stu); 这句去掉,提交事务时仍然会执行一条 update() 语句。

如果希望只有脱管对象改变了, Hibernate 才生成 update 语句,可以把映射文件中  标签的 select-before-update 设为 true, 这种会先发送一条 select 语句取得数据库中的值,判断值是否相同,如果相同就不执行 update语句。不过这种做法有一定的缺点,每次 update 语句之前总是要发送一条多余的 select 语句,影响性能。对于偶尔更改的类,设置才是有效的,对于经常要更改的类这样做是影响效率的。

(3)saveOrUpdate() 方法兼具 save() 和 update() 方法的功能,对于传入的对象, saveOrUpdate() 首先判断其是脱管对象还是临时对象,然后调用合适的方法。

 以上就是Hibernate中对象的三种状态及相互转化的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Konvertieren Sie ein Array oder Objekt mit der json_encode()-Funktion von PHP in einen JSON-String Konvertieren Sie ein Array oder Objekt mit der json_encode()-Funktion von PHP in einen JSON-String Nov 03, 2023 pm 03:30 PM

JSON (JavaScriptObjectNotation) ist ein leichtes Datenaustauschformat, das sich zu einem gängigen Format für den Datenaustausch zwischen Webanwendungen entwickelt hat. Die json_encode()-Funktion von PHP kann ein Array oder Objekt in einen JSON-String konvertieren. In diesem Artikel wird die Verwendung der json_encode()-Funktion von PHP vorgestellt, einschließlich Syntax, Parametern, Rückgabewerten und spezifischen Beispielen. Syntax Die Syntax der Funktion json_encode() lautet wie folgt: st

Quellcode-Erkundung: Wie werden Objekte in Python aufgerufen? Quellcode-Erkundung: Wie werden Objekte in Python aufgerufen? May 11, 2023 am 11:46 AM

Wedge Wir wissen, dass Objekte im Wesentlichen auf zwei Arten erstellt werden: zum einen über Python/CAPI und zum anderen durch den Aufruf eines Typobjekts. Bei Objekten integrierter Typen werden beispielsweise beide Methoden unterstützt. Listen können beispielsweise über [] oder list() erstellt werden, und letzteres ist ein aufrufendes Typobjekt. Aber beispielsweise Objekte benutzerdefinierter Klassen können wir nur durch den Aufruf von Typobjekten erstellen. Wenn ein Objekt aufgerufen werden kann, ist das Objekt aufrufbar, andernfalls ist es nicht aufrufbar. Ob ein Objekt aufrufbar ist, hängt davon ab, ob eine Methode im entsprechenden Typobjekt definiert ist. wie

Wie konvertiere ich ein MySQL-Abfrageergebnisarray in ein Objekt? Wie konvertiere ich ein MySQL-Abfrageergebnisarray in ein Objekt? Apr 29, 2024 pm 01:09 PM

So konvertieren Sie ein MySQL-Abfrageergebnis-Array in ein Objekt: Erstellen Sie ein leeres Objekt-Array. Durchlaufen Sie das resultierende Array und erstellen Sie für jede Zeile ein neues Objekt. Verwenden Sie eine foreach-Schleife, um die Schlüssel-Wert-Paare jeder Zeile den entsprechenden Eigenschaften des neuen Objekts zuzuweisen. Fügt dem Objektarray ein neues Objekt hinzu. Schließen Sie die Datenbankverbindung.

Verwenden Sie die Python-Funktion __contains__(), um die Einschlussoperation eines Objekts zu definieren Verwenden Sie die Python-Funktion __contains__(), um die Einschlussoperation eines Objekts zu definieren Aug 22, 2023 pm 04:23 PM

Verwenden Sie die Funktion __contains__() von Python, um die Einschlussoperation eines Objekts zu definieren. Python ist eine prägnante und leistungsstarke Programmiersprache, die viele leistungsstarke Funktionen für die Verarbeitung verschiedener Datentypen bietet. Eine davon besteht darin, die Eindämmungsoperation von Objekten durch Definieren der Funktion __contains__() zu implementieren. In diesem Artikel wird erläutert, wie Sie mit der Funktion __contains__() die Einschlussoperation eines Objekts definieren, und es wird ein Beispielcode bereitgestellt. Die Funktion __contains__() ist Pytho

So integrieren Sie Hibernate in ein SpringBoot-Projekt So integrieren Sie Hibernate in ein SpringBoot-Projekt May 18, 2023 am 09:49 AM

Hibernate in das SpringBoot-Projekt integrieren Vorwort Hibernate ist ein beliebtes ORM-Framework (Object Relational Mapping), das Java-Objekte Datenbanktabellen zuordnen kann, um Persistenzvorgänge zu erleichtern. Im SpringBoot-Projekt kann uns die Integration von Hibernate dabei helfen, Datenbankoperationen einfacher durchzuführen. In diesem Artikel wird die Integration von Hibernate in das SpringBoot-Projekt vorgestellt und entsprechende Beispiele bereitgestellt. 1.Abhängigkeiten einführenFügen Sie die folgenden Abhängigkeiten in die Datei pom.xml ein: org.springframework.bootspring-boot-starter-data-jpam

Was ist das Request-Objekt in PHP? Was ist das Request-Objekt in PHP? Feb 27, 2024 pm 09:06 PM

Das Request-Objekt in PHP ist ein Objekt, das zur Verarbeitung von HTTP-Anfragen verwendet wird, die vom Client an den Server gesendet werden. Über das Request-Objekt können wir die Anforderungsinformationen des Clients abrufen, z. B. die Anforderungsmethode, die Anforderungsheaderinformationen, die Anforderungsparameter usw., um die Anforderung zu verarbeiten und zu beantworten. In PHP können Sie globale Variablen wie $_REQUEST, $_GET, $_POST usw. verwenden, um angeforderte Informationen zu erhalten, aber diese Variablen sind keine Objekte, sondern Arrays. Um Anfrageinformationen flexibler und bequemer bearbeiten zu können, können Sie dies tun

Verwenden Sie die Funktion __le__() von Python, um einen Kleiner-gleich-Vergleich zweier Objekte zu definieren Verwenden Sie die Funktion __le__() von Python, um einen Kleiner-gleich-Vergleich zweier Objekte zu definieren Aug 21, 2023 pm 09:29 PM

Titel: Verwenden der Python-Funktion __le__() zum Definieren eines Kleiner-gleich-Vergleichs zweier Objekte. In Python können wir Vergleichsoperationen zwischen Objekten mithilfe spezieller Methoden definieren. Eine davon ist die Funktion __le__(), mit der Kleiner-gleich-Vergleiche definiert werden. Die Funktion __le__() ist eine magische Methode in Python und eine spezielle Funktion, die zur Implementierung der Operation „Kleiner als oder gleich“ verwendet wird. Wenn wir zwei Objekte mit dem Kleiner-gleich-Operator (<=) vergleichen, Python

Was ist der Unterschied zwischen Arrays und Objekten in PHP? Was ist der Unterschied zwischen Arrays und Objekten in PHP? Apr 29, 2024 pm 02:39 PM

In PHP ist ein Array eine geordnete Sequenz, und auf Elemente wird über einen Index zugegriffen. Ein Objekt ist eine Entität mit Eigenschaften und Methoden, die über das Schlüsselwort new erstellt werden. Der Array-Zugriff erfolgt über einen Index, der Objektzugriff über Eigenschaften/Methoden. Es werden Array-Werte und Objektreferenzen übergeben.

See all articles