溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate懶加載之<class>標簽上的lazy

發布時間:2020-10-09 07:14:17 來源:腳本之家 閱讀:145 作者:lavimer 欄目:編程語言

本文研究的主要是

lazy的概念:在真正使用某個對象的時候才去加載該對象。

Hibernate的lazy策略可以使用在:

1.<class>標簽上,可以取值:true/false。
2.<property>標簽上,可以取值:true/false,需要類增強工具,對字節碼進行修改(這個沒多大意義)。
3.<set>和<list>標簽上,可以取值:true/false/extra。
4.<many-to-one>和<one-to-one>單端關聯標簽上,可以取值:false/proxy/noproxy

下面我們來體會一下在class標簽上的lazy:

User.java:

public class User {
	/* ID */
	private int id;
	/* 用戶名 */
	private String name;
	/* 用戶密碼 */
	private String password;
	/* 創建時間 */
	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表示實體類的包名 --> 
<hibernate-mapping package="com.lixue.bean"> 
  <!-- class結點的name表示實體的類名,table表示實體映射到數據庫中table的名稱 --> 
  <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> 

測試方法:

public void testLoad1(){
	/*獲取User,load本身就支持延遲加載(class標簽的lazy對普通屬性有效)*/
	User user = (User) HibernateUtils.getSession().load(User.class, 1);
	/*不會發出sql(因為ID你查詢的時候就已經指定了,沒必要再去查)*/
	System.out.println("user.id=" + user.getId());
	/*會發出sql,因為此時真正要獲取屬性了,所以會發出sql語句,并且發出的語句查出了所有屬性,后面的屬性就不會發出語句了*/
	System.out.println("user.name=" + user.getName());
	/*不會發出sql(在查name的時候已經查出來了)*/
	System.out.println("user.password=" + user.getPassword());
	/*不會發出sql(在查name的時候就已經查出來了)*/
	System.out.println("user.createTime=" + user.getCreateTime());
}

User user = (User) HibernateUtils.getSession().load(User.class, 1);處打一個斷點進行測試!

對象會出現在對象user-->handler--->target結點中,如圖:

Hibernate懶加載之<class>標簽上的lazy

1.最開始target為null,當執行了user.getId()的時候,依然為null,因為ID在我們查詢的時候就已經指定了,此時去查詢就沒什么意義。

2.執行user.getName()的時候就發出了一條語句,如圖:

Hibernate懶加載之<class>標簽上的lazy

從圖中,我們可以看出,查詢ID的時候,并沒有發出語句,這個我們剛才已經講了,當我們查詢name屬性的時候,就發了一條語句,并且這條語句的功能是查詢所有的屬性。

3.當執行user.getPassword()user.getCreateTime()的時候,就已經不會發出語句了,因為之前已經查詢出了屬性值。

注:<class>標簽上的lazy,只支持普通屬性,不會影響類中集合的加載。

總結

以上就是本文關于Hibernate懶加載之<class>標簽上的lazy的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女