摘要:本文將繼續(xù)介紹簡(jiǎn)單的增刪改查方法和對(duì)對(duì)象實(shí)例狀態(tài)的理解查詢方法暫不提及。二實(shí)例狀態(tài)中的對(duì)象有中狀態(tài)瞬時(shí)對(duì)象持久化對(duì)象和離線對(duì)象也叫做脫管對(duì)象。持久化狀態(tài)已經(jīng)被持久化,并且加入到緩存中。處于游離狀態(tài)的對(duì)象稱為游離對(duì)象。
在上一篇《初識(shí)Hibernate》中簡(jiǎn)單介紹了在Hibernate如何加載對(duì)象和持久化對(duì)象,以及Hibernate中對(duì)象實(shí)例狀態(tài)。本文將繼續(xù)介紹Hibernate簡(jiǎn)單的增刪改查方法和對(duì)對(duì)象實(shí)例狀態(tài)的理解(查詢方法暫不提及)。一、HibernateのCRUD操作 1.1 HibernateのCreate
@Test public void testCreate() { Session session = HibernateUtils.getSession(); User user = new User(); user.setId(3); user.setUserName("Sandy"); user.setPassWord("aaa"); session.save(user); }
注意:Hibernate事務(wù)默認(rèn)是關(guān)閉的,執(zhí)行后不會(huì)報(bào)錯(cuò),但是數(shù)據(jù)并沒(méi)有成功插入數(shù)據(jù)庫(kù)。
控制臺(tái)輸出:Schema update complete
解決辦法:手動(dòng)設(shè)置事務(wù)提交
@Test public void testCreate() { Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user = new User(); user.setId(3); user.setUserName("Sandy"); user.setPassWord("aaa"); session.save(user); tx.commit(); }
控制臺(tái)輸出:Hibernate: insert into tbl_user (username, password, id) values (?, ?, ?)
save()方法把一個(gè)臨時(shí)對(duì)象加入到Session緩存中,并持久化該臨時(shí)對(duì)象,計(jì)劃執(zhí)行一個(gè)insert語(yǔ)句。1.2 HibernateのRead
這里的查詢準(zhǔn)確來(lái)說(shuō)應(yīng)該稱為對(duì)象加載。
Hibernate中session.get()方式獲取被稱為對(duì)象加載,只能從數(shù)據(jù)庫(kù)中加載出唯一一條記錄。查詢多條數(shù)據(jù)Hibernate另提供了API。
@Test public void testRead() { Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user = (User)session.get(User.class, 3); System.out.println(user); tx.commit(); }
控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
User{id=3, userName="Sandy", passWord="aaa"}
get()和load() 試圖從數(shù)據(jù)庫(kù)加載一個(gè)實(shí)體對(duì)象時(shí),Session先判斷對(duì)象是否存在,如果存在就不到數(shù)據(jù)庫(kù)中檢索。返回的對(duì)象都位于Session緩存中,接下來(lái)修改了持久化對(duì)象的屬性后,當(dāng)Session清理緩存時(shí),會(huì)根據(jù)持久化對(duì)象的屬性變化來(lái)同步更新數(shù)據(jù)庫(kù)。
? 區(qū)別:
? (1)當(dāng)數(shù)據(jù)庫(kù)中不存在與OID對(duì)應(yīng)的記錄時(shí),load()方法拋出ObjectNotFoundException異常,而get()方法返回null.
? (2)兩者采用不同的檢索策略。
? 默認(rèn)情況下,load()方法采用延遲檢索策略(Hibernate不會(huì)執(zhí)行select語(yǔ)句,僅返回實(shí)體類的代理類實(shí)例,占用內(nèi)存很少);而get()采用立即檢索策略(Hibernate會(huì)立即執(zhí)行select語(yǔ)句)。
? 使用場(chǎng)合:
? (1)如果加載一個(gè)對(duì)象的目的是為了訪問(wèn)它的各個(gè)屬性,可以用get();
? (2)如果加載一個(gè)對(duì)象的目的是為了刪除它,或者建立與別的對(duì)象的關(guān)聯(lián)關(guān)系,可以用load() ;
1.3 HibernateのUpdate更新操作并沒(méi)有使用session.update()方法,直接tx.commit()便能夠成功更新數(shù)據(jù)。session.upate()方法另有作用。
@Test public void testUpdate() { Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user = (User)session.get(User.class, 3); user.setUserName("Bob"); user.setPassWord("123"); // 臟數(shù)據(jù)(Dirty Data) // 過(guò)時(shí)數(shù)據(jù)檢測(cè)(前提是該對(duì)象是持久態(tài)) tx.commit(); }
控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
Hibernate: update tbl_user set username=?, password=? where id=?
Session在清理緩存的時(shí)候會(huì)自動(dòng)進(jìn)行臟檢查(dirty-check),如果發(fā)現(xiàn)Session緩存中的對(duì)象與數(shù)據(jù)庫(kù)中相應(yīng)的記錄不一致,就會(huì)同步數(shù)據(jù)庫(kù)。1.4 HibernateのDelete
@Test public void testDelete() { Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user = (User)session.get(User.class, 3); user.setUserName("Bob"); user.setPassWord("123"); session.delete(user); tx.commit(); }
控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
Hibernate: delete from tbl_user where id=?
計(jì)劃執(zhí)行一個(gè)delete語(yǔ)句,把對(duì)象從Session緩存中刪除。1.5 saveOrUpdate
同時(shí)包含了save()和update()方法的功能。如果傳入的是臨時(shí)對(duì)象,就調(diào)用save()方法;如果傳入的是游離對(duì)象,就調(diào)用update()方法如果傳入的是持久化對(duì)象,就直接返回。
@Test public void testSaveOrUpdate() { Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user = new User(); user.setId(5); user.setUserName("Sandy"); user.setPassWord("123"); session.saveOrUpdate(user); User user2 = (User)session.get(User.class, 1); user2.setUserName("Andy"); user2.setPassWord("apple"); session.saveOrUpdate(user2); tx.commit(); session.close(); }
控制臺(tái)輸出:Hibernate: select user_.id, user_.username as username2_8_, user_.password as password3_8_ from tbl_user user_ where user_.id=?
Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
Hibernate: insert into tbl_user (username, password, id) values (?, ?, ?)
Hibernate: update tbl_user set username=?, password=? where id=?
update()方法把游離對(duì)象加入當(dāng)前Session緩存中,計(jì)劃執(zhí)行update語(yǔ)句。當(dāng)update()方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí),如果session緩存中已經(jīng)有一個(gè)同類型且ID相同的持久化對(duì)象,那么update()方法會(huì)拋出NonUniqueException異常。當(dāng)update()方法關(guān)聯(lián)一個(gè)持久化對(duì)象時(shí),該方法不起作用。二、Hibernateの實(shí)例狀態(tài)close():清空session緩存。
Hibernate中的對(duì)象有3中狀態(tài),瞬時(shí)對(duì)象(TransientObjects)、持久化對(duì)象(PersistentObjects)和離線對(duì)象(DetachedObjects也叫做脫管對(duì)象)。
Java對(duì)象在Hibernate持久化層的狀態(tài):
瞬時(shí)(transient)狀態(tài):剛用new語(yǔ)句創(chuàng)建,還沒(méi)有被持久化,并且不處于session緩存中(處于臨時(shí)狀態(tài)的對(duì)象成為臨時(shí)對(duì)象)。
持久化(Persistent)狀態(tài):已經(jīng)被持久化,并且加入到session緩存中。處于持久化狀態(tài)的對(duì)象稱為持久化對(duì)象。
游離(Detached)狀態(tài):已經(jīng)被持久化,但不再處于session緩存中。處于游離狀態(tài)的對(duì)象稱為游離對(duì)象。
刪除狀態(tài):不再處于session緩存中,并且session已經(jīng)計(jì)劃將其從數(shù)據(jù)庫(kù)中刪除。
@Test public void testState() { Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); // 持久態(tài)對(duì)象 // 1.在數(shù)據(jù)庫(kù)中有唯一一條記錄關(guān)聯(lián) 2.必須跟一個(gè)session關(guān)聯(lián)(必須納入Hibernate容器) User user = (User)session.get(User.class, 1); // 臨時(shí)態(tài) // User user = new User(); user.setUserName("Fancy"); user.setPassWord("abc"); // 臟數(shù)據(jù)(Dirty Data)過(guò)時(shí)數(shù)據(jù)檢測(cè)(前提是該對(duì)象是持久態(tài)) tx.commit(); // 關(guān)閉session session.close(); // 游離態(tài)(Detached) // 1.在數(shù)據(jù)庫(kù)中有唯一一條記錄對(duì)應(yīng) 2.當(dāng)前user沒(méi)有跟Hibernate的session關(guān)聯(lián)(曾經(jīng)跟Hibernate關(guān)聯(lián),現(xiàn)在沒(méi)有) // 無(wú)法進(jìn)行臟數(shù)據(jù)檢測(cè) System.out.println(user); //把游離態(tài)對(duì)象變?yōu)槌志脩B(tài)(再次納入Hibernate容器管理,再跟一個(gè)session關(guān)聯(lián)起來(lái)) Session session2 =HibernateUtils.getSession(); Transaction tx2 = session2.beginTransaction(); user.setUserName("Kathy"); user.setPassWord("good"); //把游離態(tài)對(duì)象同一個(gè)session關(guān)聯(lián),將對(duì)象狀態(tài)變?yōu)槌志脩B(tài) session2.update(user); tx2.commit(); } }
控制臺(tái)輸出:Hibernate: select user0_.id as id1_8_0_, user0_.username as username2_8_0_, user0_.password as password3_8_0_ from tbl_user user0_ where user0_.id=?
User{id=1, userName="Fancy", passWord="abc"}
Hibernate: update tbl_user set username=?, password=? where id=?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73488.html
摘要:從好的方面來(lái)說(shuō),只需使用普通的就可以在不使用文件的情況下引導(dǎo)實(shí)現(xiàn)。請(qǐng)注意,為簡(jiǎn)潔起見(jiàn),我們省略了類案例結(jié)論在本文中,我們展示了如何使用的接口和的類的自定義實(shí)現(xiàn)以編程方式引導(dǎo)實(shí)體管理器,而不必依賴傳統(tǒng)的文件。 案例概述 大多數(shù)JPA驅(qū)動(dòng)的應(yīng)用程序大量使用persistence.xml文件來(lái)獲取JPA實(shí)現(xiàn),例如Hibernate或OpenJPA。 我們的方法提供了一種集中式機(jī)制,用于配置一...
摘要:查詢照樣寫(xiě)就行,如下參考問(wèn)題七中關(guān)于多表連接查詢和返回值集合中對(duì)象問(wèn)題錯(cuò)誤的查詢語(yǔ)句釋放分析原來(lái)是查詢出來(lái)的字段并不能自動(dòng)轉(zhuǎn)換為對(duì)象。參考問(wèn)題八原因原生的語(yǔ)句中返回值為,而語(yǔ)句中的返回值位型的,網(wǎng)上說(shuō)的主要是兼容而做的。 首先奉上Hibernate3.2 API地址:http://docs.jboss.org/hiberna...Hibernate4.3 API地址:http://do...
摘要:忽略該字段的映射省略創(chuàng)建數(shù)據(jù)訪問(wèn)層接口,需要繼承,第一個(gè)泛型參數(shù)是實(shí)體對(duì)象的名稱,第二個(gè)是主鍵類型。 SpringBoot 是為了簡(jiǎn)化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問(wèn)題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程 上一篇介紹了Spring JdbcTempl...
摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...
摘要:文章系列從零入門(mén)系列之從零入門(mén)系列之程序結(jié)構(gòu)設(shè)計(jì)說(shuō)明前言本篇文章開(kāi)始代碼實(shí)踐,系統(tǒng)設(shè)計(jì)從底向上展開(kāi),因此本篇先介紹如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)表實(shí)體類的設(shè)計(jì)實(shí)現(xiàn)。主鍵由數(shù)據(jù)庫(kù)自動(dòng)生成主要是自動(dòng)增長(zhǎng)型主鍵由程序控制。 文章系列 【從零入門(mén)系列-0】Sprint Boot 之 Hello World 【從零入門(mén)系列-1】Sprint Boot 之 程序結(jié)構(gòu)設(shè)計(jì)說(shuō)明 前言 本篇文章開(kāi)始代碼實(shí)踐,系統(tǒng)...
閱讀 1796·2021-11-24 10:18
閱讀 2310·2021-11-18 13:20
閱讀 2403·2021-08-23 09:46
閱讀 1082·2019-08-30 15:56
閱讀 2905·2019-08-30 15:53
閱讀 816·2019-08-30 14:22
閱讀 542·2019-08-29 15:34
閱讀 2593·2019-08-29 12:14