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