Hibernate懶加載之<class>標(biāo)簽上的lazy
本文研究的主要是
lazy的概念:在真正使用某個(gè)對(duì)象的時(shí)候才去加載該對(duì)象。
Hibernate的lazy策略可以使用在:
1.<class>標(biāo)簽上,可以取值:true/false。
2.<property>標(biāo)簽上,可以取值:true/false,需要類(lèi)增強(qiáng)工具,對(duì)字節(jié)碼進(jìn)行修改(這個(gè)沒(méi)多大意義)。
3.<set>和<list>標(biāo)簽上,可以取值:true/false/extra。
4.<many-to-one>和<one-to-one>單端關(guān)聯(lián)標(biāo)簽上,可以取值:false/proxy/noproxy
下面我們來(lái)體會(huì)一下在class標(biāo)簽上的lazy:
User.java:
public class User { /* ID */ private int id; /* 用戶(hù)名 */ private String name; /* 用戶(hù)密碼 */ private String password; /* 創(chuàng)建時(shí)間 */ private Date createTime; //省略setter和getter方法 }
User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- package表示實(shí)體類(lèi)的包名 --> <hibernate-mapping package="com.lixue.bean"> <!-- class結(jié)點(diǎn)的name表示實(shí)體的類(lèi)名,table表示實(shí)體映射到數(shù)據(jù)庫(kù)中table的名稱(chēng) --> <class name="User" table="t_user" lazy="true"> <id name="id"> <generator class="native" /> </id> <!-- 映射普通屬性 --> <property name="name" /> <property name="password" /> <property name="createTime" /> </class> </hibernate-mapping>
測(cè)試方法:
public void testLoad1(){ /*獲取User,load本身就支持延遲加載(class標(biāo)簽的lazy對(duì)普通屬性有效)*/ User user = (User) HibernateUtils.getSession().load(User.class, 1); /*不會(huì)發(fā)出sql(因?yàn)镮D你查詢(xún)的時(shí)候就已經(jīng)指定了,沒(méi)必要再去查)*/ System.out.println("user.id=" + user.getId()); /*會(huì)發(fā)出sql,因?yàn)榇藭r(shí)真正要獲取屬性了,所以會(huì)發(fā)出sql語(yǔ)句,并且發(fā)出的語(yǔ)句查出了所有屬性,后面的屬性就不會(huì)發(fā)出語(yǔ)句了*/ System.out.println("user.name=" + user.getName()); /*不會(huì)發(fā)出sql(在查name的時(shí)候已經(jīng)查出來(lái)了)*/ System.out.println("user.password=" + user.getPassword()); /*不會(huì)發(fā)出sql(在查name的時(shí)候就已經(jīng)查出來(lái)了)*/ System.out.println("user.createTime=" + user.getCreateTime()); }
在User user = (User) HibernateUtils.getSession().load(User.class, 1);
處打一個(gè)斷點(diǎn)進(jìn)行測(cè)試!
對(duì)象會(huì)出現(xiàn)在對(duì)象user-->handler--->target結(jié)點(diǎn)中,如圖:
1.最開(kāi)始target為null,當(dāng)執(zhí)行了user.getId()
的時(shí)候,依然為null,因?yàn)镮D在我們查詢(xún)的時(shí)候就已經(jīng)指定了,此時(shí)去查詢(xún)就沒(méi)什么意義。
2.執(zhí)行user.getName()
的時(shí)候就發(fā)出了一條語(yǔ)句,如圖:
從圖中,我們可以看出,查詢(xún)ID的時(shí)候,并沒(méi)有發(fā)出語(yǔ)句,這個(gè)我們剛才已經(jīng)講了,當(dāng)我們查詢(xún)name屬性的時(shí)候,就發(fā)了一條語(yǔ)句,并且這條語(yǔ)句的功能是查詢(xún)所有的屬性。
3.當(dāng)執(zhí)行user.getPassword()
和user.getCreateTime()
的時(shí)候,就已經(jīng)不會(huì)發(fā)出語(yǔ)句了,因?yàn)橹耙呀?jīng)查詢(xún)出了屬性值。
注:<class>標(biāo)簽上的lazy,只支持普通屬性,不會(huì)影響類(lèi)中集合的加載。
總結(jié)
以上就是本文關(guān)于Hibernate懶加載之<class>標(biāo)簽上的lazy的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
解決idea 通過(guò)build project 手動(dòng)觸發(fā)熱部署失敗的問(wèn)題
在debug運(yùn)行項(xiàng)目的過(guò)程中,并且保證(不添加方法,不修改方法名)一定的規(guī)則的情況下,可以通過(guò)build project 來(lái)手動(dòng)熱部署項(xiàng)目,本文給大家介紹解決idea 通過(guò)build project 手動(dòng)觸發(fā)熱部署失敗的問(wèn)題,感興趣的朋友一起看看吧2023-12-12解決Tomcat修改get提交請(qǐng)求亂碼問(wèn)題
這篇文章主要介紹了Tomcat修改get提交請(qǐng)求亂碼問(wèn)題的解決方案,需要的朋友參考下2017-04-04SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問(wèn)題及解決
這篇文章主要介紹了SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java程序員自己的圖片轉(zhuǎn)文字OCR識(shí)圖工具分享
這篇文章主要介紹了java程序員自己的圖片轉(zhuǎn)文字OCR識(shí)圖工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11SpringBoot中@PostConstruct 注解的實(shí)現(xiàn)
在Spring Boot框架中,?@PostConstruct是一個(gè)非常有用的注解,它用于在依賴(lài)注入完成后執(zhí)行初始化方法,本文將介紹?@PostConstruct的基本概念、使用場(chǎng)景以及提供詳細(xì)的代碼示例,感興趣的可以了解一下2024-09-09教你用Java GUI實(shí)現(xiàn)文本文件的讀寫(xiě)
今天帶大家來(lái)學(xué)習(xí)怎么用JavaSwing實(shí)現(xiàn)實(shí)現(xiàn)文本文件讀寫(xiě),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05java結(jié)合WebSphere MQ實(shí)現(xiàn)接收隊(duì)列文件功能
WebSphereMQ,也稱(chēng)MQSeries,以一致的、可靠的和易于管理的方式來(lái)連接應(yīng)用程序,并為跨部門(mén)、企業(yè)范圍的集成提供了可靠的基礎(chǔ)。通過(guò)為重要的消息和事務(wù)提供可靠的、一次且僅一次的傳遞,MQ可以處理復(fù)雜的通信協(xié)議,并動(dòng)態(tài)地將消息傳遞工作負(fù)載分配給可用的資源。2015-10-10SpringBoot在idea中的 .idea和 .iml文件的作用
本文主要介紹了SpringBoot在idea中的 .idea和 .iml文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解
橋接,顧名思義,就是用來(lái)連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過(guò)示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下2022-09-09