国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Hibernate中Session的load()和get()方法

2019-11-08 02:20:28
字體:
來源:轉載
供稿:網友

session的load()方法和get()方法根據給定的對象id從數據庫表中加載一條記錄并轉換為一個特定的持久類對象。load()方法在沒有找到特定的持久類對象所對應的數據庫表中的記錄時,會拋出ObjectNotFoundException,而get()方法返回null。

get()方法和load()方法返回的對象位于Session的緩存中,因此黨對他的屬性進行修改后,Session清理緩存時,會根據持久化對象的屬性來同步更新數據庫。load()和get()方法的區別:

(1)load()方法:如果load方法不能再緩存或者數據庫中找到對象,會拋出異常;load()方法從不返回null;load()方法返回一個代理類的實例而不是真正的持久實例。代理是一個占位符,當第一次調用他時才裝載真正的對象。

(2)get()方法:如果沒有找到對象返回null,另一方面,get()方法從不返回代理類而是直接返回實體類。load()方法可以充分利用內部緩存和二級緩存中的現有數據,而get()方法僅僅在內部緩存中進行數據查找,如果沒有發現對應的數據,將越過二級緩存,直接調用SQL完成數據讀取。該如何選擇load()方法和get()方法:(1)load()方法應用在對象存在的情況下加載(2)利用get()方法可以首先判斷對象是否存在,然后在獲得它。/** * 測試load方法 * 一旦加載了持久化實例之后,在代碼中對持久化實例所做的修改,將會被保存到數據庫中。 * 程序對持久化實例所做的修改會在session flush之前被自動保存到數據庫中, * 無需程序調用其他方法(不需要調用update方法)。也就是說修改對象的最簡單方法就是在session處于打開狀態時load它, * 然后直接修改即可。這種方法有一個極大的性能缺陷:當需要修改某條記錄的時候,這種做法會產生兩條sql語句: * 一條用于查詢指定記錄,一條用于修改該記錄。 */ public static void testLoad(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); Company company = (Company) session.load(Company.class, 1); System.out.PRintln(company.getShortName()); company.setShortName("總公司"); transaction.commit(); session.close(); System.out.println(company.getShortName()); } /** * 測試get方法 */ public static void testGet(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); Company company = (Company) session.get(Company.class, 1); System.out.println(company.getShortName()); company.setShortName("總廠"); transaction.commit(); session.close(); System.out.println(company.getShortName()); } /** * 測試load與get方法在數據庫中沒有匹配記錄時的反應 * 該程序的輸出為:get方法返回值為null。原因: * 如果沒有匹配的數據庫記錄,load方法可能拋出異常HibernateException;如果在類映射文件中指定延遲加載, * 則load方法會返回一個未初始化的代理對象,這個代理對象并沒有裝載數據庫對象,直到程序調用該代理對象的某方法時, * hibernate才訪問數據庫。默認情況下為延遲加載 * get方法立即訪問數據庫,如果沒有對應的記錄,get方法返回null * 兩者的主要區別在是否延遲加載。 */ public static void testLoadAndGet(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); Company company = (Company) session.get(Company.class, 11); if(company == null){ System.out.println("get方法返回值為null"); } Company company1 = (Company)session.load(Company.class, 11); if(company1 == null){ System.out.println("load方法返回值為null"); } transaction.commit(); session.close(); }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 锡林郭勒盟| 凌海市| 三亚市| 蓝田县| 忻城县| 黄浦区| 通道| 乐平市| 理塘县| 宽城| 绍兴市| 吴江市| 武强县| 屏东市| 阿克苏市| 偏关县| 娄烦县| 临沂市| 古蔺县| 马山县| 隆化县| 资溪县| 本溪| 仁化县| 库伦旗| 南部县| 扎兰屯市| 临桂县| 武陟县| 株洲县| 遂平县| 宁化县| 孝义市| 辛集市| 汝州市| 长丰县| 望城县| 禹城市| 万载县| 深州市| 元阳县|