激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 深入學(xué)習(xí)Hibernate持久化對(duì)象的三個(gè)狀態(tài)

深入學(xué)習(xí)Hibernate持久化對(duì)象的三個(gè)狀態(tài)

2020-12-30 10:50動(dòng)力節(jié)點(diǎn) Java教程

Hibernate中的對(duì)象有3中狀態(tài),瞬時(shí)對(duì)象(TransientObjects)、持久化對(duì)象(PersistentObjects)和離線對(duì)象(DetachedObjects也叫做脫管對(duì)象),下面通過(guò)本文給大家分享Hibernate持久化對(duì)象的三個(gè)狀態(tài),一起看看吧

hibernate中的對(duì)象有3中狀態(tài),瞬時(shí)對(duì)象(transientobjects)、持久化對(duì)象(persistentobjects)和離線對(duì)象(detachedobjects也叫做脫管對(duì)象)。

下圖3.1顯示了瞬時(shí)對(duì)象、持久化對(duì)象和離線對(duì)象之間的關(guān)系以及它們之間的轉(zhuǎn)換。

深入學(xué)習(xí)Hibernate持久化對(duì)象的三個(gè)狀態(tài)

圖3.1

臨時(shí)狀態(tài):由java的new命令開(kāi)辟內(nèi)存空間的java對(duì)象也就是普通的java對(duì)象,如果沒(méi)有變量引用它它將會(huì)被jvm收回。臨時(shí)對(duì)象在內(nèi)存中是孤立存在的,它的意義是攜帶信息載體,不和數(shù)據(jù)庫(kù)中的數(shù)據(jù)由任何的關(guān)聯(lián)。通過(guò)session的save()方法和saveorupdate()方法可以把一個(gè)臨時(shí)對(duì)象和數(shù)據(jù)庫(kù)相關(guān)聯(lián),并把臨時(shí)對(duì)象攜帶的信息通過(guò)配置文件所做的映射插入數(shù)據(jù)庫(kù)中,這個(gè)臨時(shí)對(duì)象就成為持久化對(duì)象。

持久化狀態(tài):持久化對(duì)象在數(shù)據(jù)庫(kù)中有相應(yīng)的記錄,持久化對(duì)象可以是剛被保存的,或者剛被加載的,但都是在相關(guān)聯(lián)的session聲明周期中保存這個(gè)狀態(tài)。如果是直接數(shù)據(jù)庫(kù)查詢(xún)所返回的數(shù)據(jù)對(duì)象,則這些對(duì)象和數(shù)據(jù)庫(kù)中的字段相關(guān)聯(lián),具有相同的id,它們馬上變成持久化對(duì)象。如果一個(gè)臨時(shí)對(duì)象被持久化對(duì)象引用,也立馬變?yōu)槌志没瘜?duì)象。
如果使用delete()方法,持久化對(duì)象變?yōu)榕R時(shí)對(duì)象,并且刪除數(shù)據(jù)庫(kù)中相應(yīng)的記錄,這個(gè)對(duì)象不再與數(shù)據(jù)庫(kù)有任何的聯(lián)系。

持久化對(duì)象總是與session和transaction關(guān)聯(lián)在一起,在一個(gè)session中,對(duì)持久化對(duì)象的操作不會(huì)立即寫(xiě)到數(shù)據(jù)庫(kù),只有當(dāng)transaction(事務(wù))結(jié)束時(shí),才真正的對(duì)數(shù)據(jù)庫(kù)更新,從而完成持久化對(duì)象和數(shù)據(jù)庫(kù)的同步。在同步之前的持久化對(duì)象成為臟對(duì)象。

當(dāng)一個(gè)session()執(zhí)行close()、clear()、或evict()之后,持久化對(duì)象就變?yōu)殡x線對(duì)象,這時(shí)對(duì)象的id雖然擁有數(shù)據(jù)庫(kù)的識(shí)別值,但已經(jīng)不在hibernate持久層的管理下,他和臨時(shí)對(duì)象基本上一樣的,只不過(guò)比臨時(shí)對(duì)象多了數(shù)據(jù)庫(kù)標(biāo)識(shí)id。沒(méi)有任何變量引用時(shí),jvm將其回收。

脫管狀態(tài):session關(guān)閉之后,與此session關(guān)聯(lián)的持久化對(duì)象就變成為脫管對(duì)象,可以繼續(xù)對(duì)這個(gè)對(duì)象進(jìn)行修改,如果脫管對(duì)象被重新關(guān)聯(lián)到某個(gè)新的session上,會(huì)在此轉(zhuǎn)成持久對(duì)象。

脫管對(duì)象雖然擁有用戶(hù)的標(biāo)識(shí)id,所以通過(guò)update()、saveorupdate()等方法,再次與持久層關(guān)聯(lián)。

下面我們就通過(guò)使用hibernate,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查來(lái)體現(xiàn)三種狀態(tài)之間的轉(zhuǎn)換過(guò)程。

添加修改演示三種狀態(tài)之間的變化

 當(dāng)我們建立session都要實(shí)例化sessionfactory,所以我們把重復(fù)的代碼進(jìn)行封裝,并且session是單線程的。我們把對(duì)session的管理,打開(kāi)session,關(guān)閉session等封裝到工具類(lèi)中,代碼如下所示。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.bjpowernode.hibernate;
import org.hibernate.session;
import org.hibernate.sessionfactory;
import org.hibernate.cfg.configuration;
public class hibernateutils {
 private static sessionfactory factory;
 //static只初始化一次.
 static
 {
 try{
 //默認(rèn)讀取的是hibernate.cfg.xml 文件.
 configuration cfg = new configuration().configure();
 //建立sessionfactory.
 factory = cfg.buildsessionfactory();
 }catch(exception e )
 {
 e.printstacktrace();
 }
 }
 public static session getsession()
 {
 //打開(kāi)session.
 return factory.opensession();
 }
 //關(guān)閉session.
 public static void closesession(session session)
 {
 //判斷是否為空.
 //判斷是否是打開(kāi)狀態(tài)再進(jìn)行關(guān)閉.
 if(session!=null)
 {
 if(session.isopen())
 {
 session.close();
 }
 }
 }
 //返回工廠類(lèi).
 public static sessionfactory getsessionfactory()
 {
 return factory;
 }
}

      hibernate.cfg.xml代碼如下所示。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!doctype hibernate-configuration public
 "-//hibernate/hibernate configuration dtd 3.0//en"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory >
 <property name="hibernate.connection.driver_class">com.mysql.jdbc.driver</property>
 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_session</property>
 <property name="hibernate.connection.username">root</property>
 <property name="hibernate.connection.password">root</property>
 <property name="hibernate.dialect">org.hibernate.dialect.mysqldialect</property>
 <property name="hibernate.show_sql">true</property>
 <mapping resource="com/bjpowernode/hibernate/user.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

之前我們把對(duì)表添加的操作放到普通的java類(lèi)中,在這個(gè)類(lèi)的main()方法中執(zhí)行,如果我們?cè)賹?duì)表進(jìn)行其他的操作呢?那是不是還要建立新的java類(lèi),多個(gè)方法就不容易測(cè)試了。我們使用測(cè)試工具類(lèi)junit來(lái)做測(cè)試,來(lái)測(cè)試增刪改查。首先建立源目錄,在test包中放測(cè)試程序。

我們建立我們的測(cè)試程序sessiontest.java,繼承testcase類(lèi),這樣我們?cè)趕essiontest.java類(lèi)中測(cè)試數(shù)據(jù)庫(kù)中的某個(gè)方法,方法名的規(guī)范要以test開(kāi)頭。我們向user表中添加一條記錄如下代碼所示。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.bjpowernode.hibernate;
import java.util.date;
import junit.framework.testcase;
import org.hibernate.session;
import org.hibernate.transaction;
public class sessiontest extends testcase {
 //測(cè)試方法以test開(kāi)頭.
 public void testsave1()
 {
 session session = null;
 transaction tx = null;
 try
 {
 //取得session.
 session = hibernateutils.getsession();
 //自己開(kāi)啟事務(wù). 返回 transient的一個(gè)實(shí)例.
 tx = session.begintransaction();
 //傳入值.變?yōu)閠ransient狀態(tài).
 user user = new user();
 user.setname("張三");
 user.setpassword("123");
 user.setcreatetime(new date());
 user.setexpiretime(new date());
 //進(jìn)行保存.執(zhí)行save則對(duì)session進(jìn)行管理了. 處于持久狀態(tài).
 //persistent狀態(tài)的對(duì)象.當(dāng)對(duì)象的屬性發(fā)生改變的時(shí)候,hibernate在清理
 //緩存的時(shí)候(臟數(shù)據(jù)檢查)的時(shí)候,會(huì)和數(shù)據(jù)庫(kù)同步.
 session.save(user);
 user.setname("李四");
 //再次提交.
 tx.commit();
 }catch(exception e)
 {
 e.printstacktrace();
 if(tx!=null)
 {
 // 事務(wù)回滾.
 tx.rollback();
 }
 }finally
 {
 //關(guān)閉session.當(dāng)關(guān)閉session時(shí)處于detached狀態(tài).
 hibernateutils.closesession(session);
 }
 }

     首先是建立對(duì)象與表的會(huì)話session,開(kāi)啟事務(wù)session.begintransaction(),實(shí)例化user對(duì)象,當(dāng)我們user user = new user()的時(shí)候,當(dāng)我們new一個(gè)對(duì)象的時(shí)候數(shù)據(jù)庫(kù)是沒(méi)有的,所以是transient對(duì)象(臨時(shí)對(duì)象),然后給user賦值,設(shè)置名稱(chēng)和密碼以及其他屬性。 為對(duì)象的所有屬性賦值完畢,接下來(lái)保存到會(huì)話session中,拿到session執(zhí)行save(user)方法。 當(dāng)我們執(zhí)行session的save()方法時(shí),這個(gè)對(duì)象就被session管理了,session中有個(gè)map,會(huì)把對(duì)象放到map中,此時(shí)的對(duì)象我們就成為persistent狀態(tài)(持久狀態(tài))。

 接下來(lái)我們又把user中的name屬性設(shè)置為“李四”,之后提交事務(wù)。我們先再會(huì)話中存儲(chǔ)的“張三”,之后改為“李四”。try catch來(lái)?yè)渥疆惓#?dāng)執(zhí)行完畢,關(guān)閉session后,對(duì)象處于detached狀態(tài)(離線狀態(tài))。

我們創(chuàng)建數(shù)據(jù)庫(kù),利用exportdb.java方法建立表。之后執(zhí)行sessiontest的testsave1()方法,當(dāng)執(zhí)行到session方法的時(shí)候,表中自動(dòng)生成user表的id值,并且名子為“張三”,之后再次執(zhí)行,名字又變?yōu)?ldquo;李四”,之后執(zhí)行事務(wù)的commit()方法tx .commit ,此時(shí)控制臺(tái)才發(fā)出語(yǔ)句,如下圖3.2。

深入學(xué)習(xí)Hibernate持久化對(duì)象的三個(gè)狀態(tài)

 從控制臺(tái)的語(yǔ)句中可以看出,顯示發(fā)送的插入sql語(yǔ)句,后是update語(yǔ)句,首先是持久化對(duì)象user中的名字為“張三”,所以save的時(shí)候生成inset語(yǔ)句。此時(shí)user處于持久狀態(tài)的對(duì)象,我們之后又給變了持久化對(duì)象,所以發(fā)送了一個(gè)修改語(yǔ)句。也就是當(dāng)持久化對(duì)象發(fā)生修改時(shí),我們?cè)偬峤皇聞?wù),就會(huì)把修改的全部體現(xiàn)出來(lái)(update語(yǔ)句)。
也就是我們?cè)偬峤皇聞?wù)的時(shí)候,在清理緩存,也就是臟數(shù)據(jù)檢查(內(nèi)存中變了,而數(shù)據(jù)沒(méi)變),要檢查哪些數(shù)據(jù)是有問(wèn)題的,要保持內(nèi)存和數(shù)據(jù)庫(kù)的同步。所以我們數(shù)據(jù)庫(kù)中添加的記錄,user的名字為李四(如圖3.3所示)。

深入學(xué)習(xí)Hibernate持久化對(duì)象的三個(gè)狀態(tài)

圖3.3 

如果上述代碼中,我們?cè)谛薷拿譃槔钏暮髐ser.setname("李四");我們顯示調(diào)用session的update()方法,session.update(),運(yùn)行,會(huì)看到控制臺(tái)上打印的sql語(yǔ)句和我們不加如session.update()打印的相同。持久化對(duì)象只要更改了,在提交事務(wù)的時(shí)候就會(huì)同步,沒(méi)有必要再顯示調(diào)用。

 detached狀態(tài)演示

我們?cè)趫?zhí)行完所有的操作,關(guān)閉session后,此時(shí)的user對(duì)象變?yōu)閐etached狀態(tài),此時(shí)進(jìn)行操作。

代碼如下所示。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public void testsave3()
 {
 session session = null;
 transaction tx = null;
 user user = null;
 try
 {
  //取得session.
  session = hibernateutils.getsession();
  //自己開(kāi)啟事務(wù). fanhui transient的一個(gè)實(shí)例.
  tx = session.begintransaction();
  //傳入值.變?yōu)閠ransient狀態(tài).
  user = new user();
  user.setname("張三");
  user.setpassword("123");
  user.setcreatetime(new date());
  user.setexpiretime(new date());
  //進(jìn)行保存.執(zhí)行save則對(duì)session進(jìn)行管理了. 處于持久狀態(tài).
  //persistent狀態(tài)的對(duì)象.當(dāng)對(duì)象的屬性發(fā)生改變的時(shí)候,hibernate在清理
  //緩存的時(shí)候(臟數(shù)據(jù)檢查)的時(shí)候,會(huì)和數(shù)據(jù)庫(kù)同步.
  session.save(user);
  user.setname("李四");
  //可以顯示的調(diào)用update方法,因?yàn)榇藭r(shí)為持久狀態(tài),調(diào)用update沒(méi)有什么意義.
  //再次提交.
  tx.commit();
 }catch(exception e)
 {
  e.printstacktrace();
  if(tx!=null)
  {
  // 事務(wù)回滾.
  tx.rollback();
  }
 }finally
 {
  //關(guān)閉session.當(dāng)關(guān)閉session時(shí)處于detached狀態(tài).
  hibernateutils.closesession(session);
 }
 //已經(jīng)不能用以前的session了.
 user.setname("王五");
 try
 {
  //得到新的session.
  session = hibernateutils.getsession();
  //開(kāi)啟事務(wù).
  session.begintransaction();
  //將detached狀態(tài)的對(duì)象重新納入session管理.
  //此時(shí)將變?yōu)閜ersistent狀態(tài)的對(duì)象.
  //persistent狀態(tài)的對(duì)象,在清理緩存時(shí),會(huì)根數(shù)據(jù)庫(kù)同步.
  session.update(user);
  //提交事務(wù).把內(nèi)存的改變提交到數(shù)據(jù)庫(kù)上.
  session.gettransaction().commit();
 }catch(exception e)
 {
  e.printstacktrace();
  session.gettransaction().rollback();
 }finally
 {
  hibernateutils.closesession(session);
 }
 }

取得detached狀態(tài)的user對(duì)象,改變這個(gè)對(duì)象的name值,user.setname("王五");之后我們?cè)賜ew一個(gè)新的

session,通過(guò)session開(kāi)啟事務(wù),之后更新操作,session.update(user),也就是把離線的對(duì)象(或脫管對(duì)象)再納入session管理,這樣就會(huì)和數(shù)據(jù)庫(kù)同步,因?yàn)閟ession.update()就把user對(duì)象納入session管理,user對(duì)象由離線狀態(tài)變?yōu)閜ersistent狀態(tài)。

提交事務(wù),將和數(shù)據(jù)庫(kù)同步。把內(nèi)存的改變體現(xiàn)到數(shù)據(jù)庫(kù)上。控制臺(tái)sql語(yǔ)句以及運(yùn)行向表中添加記錄結(jié)果如圖3.4,3.5所示。

深入學(xué)習(xí)Hibernate持久化對(duì)象的三個(gè)狀態(tài)

圖3.4

深入學(xué)習(xí)Hibernate持久化對(duì)象的三個(gè)狀態(tài)

總結(jié)

以上所述是小編給大家介紹的hibernate持久化對(duì)象的三個(gè)狀態(tài),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品最新国内在线播放 | 日韩黄色片在线观看 | 久久综合一区二区 | 国产精品成人亚洲一区二区 | av在线播放电影 | 国产午夜精品久久久久久免费视 | 中文字幕专区高清在线观看 | a集毛片 | 久草在线视频福利 | 欧美视频在线一区二区三区 | 国产亚洲精品久久久久久大师 | 亚洲一区久久 | 国产88久久久国产精品免费二区 | 欧美成人aaaaaaaa免费 | 奇米影视奇奇米色狠狠色777 | av电影免费在线 | 国产做爰全免费的视频黑人 | 欧美日韩精品一区二区三区不卡 | 精品国产一区二区三区四区在线 | 久久亚洲春色中文字幕久久 | av免播放 | 国产精品一区二区三区在线 | 欧美日本国产精品 | 中文字幕www.| 国产羞羞视频在线观看免费应用 | 一级成人免费 | 精品国产一区二区三区四 | 国产三级影院 | 成人爱情偷拍视频在线观看 | 91av久久| 日本黄免费 | 国产高潮国产高潮久久久91 | 免费黄色短视频网站 | 日韩电影一区二区三区 | www.91pron| 精品久久久久久中文字幕 | 久久久日韩精品一区二区三区 | 成人在线观看免费观看 | 亚洲网站一区 | 日本在线免费观看视频 | 激情视频免费看 |