1. 程式人生 > >Hibernate框架-----屬性延遲載入和關係延遲載入(七)

Hibernate框架-----屬性延遲載入和關係延遲載入(七)

屬性的延遲:

我們之前在獲取一條資料的時候採用的都是Session的get方法,這種方式不是延遲載入,也就是呼叫這個方法就會立刻訪問資料庫查出此物件的資料,當我們採用Session的load方法時,採用的是屬性延遲載入,就是隻有在訪問這個物件的屬性,hibernate才會訪問資料庫進行查詢

下面兩種程式碼和測試結果一看就明白。

1.get方法,非延遲

Product p=(Product)s.get(Product.class, 4);
		System.out.println("沒訪問屬性的時候不會訪問資料庫");
		System.out.println(p.getName());
		System.out.println("我的上面的幾串表示問資料庫");


2.load方法,屬性延遲載入

Product p=(Product)s.load(Product.class, 4);
		System.out.println("沒訪問屬性的時候不會訪問資料庫");
		System.out.println(p.getName());
		System.out.println("我的上面的幾串表示問資料庫");


上圖程式碼和結果圖很好的解釋了屬性延遲載入。

關係延遲載入

關係延遲載入又叫懶載入,即lazyload,在多對一、多對多中的時候都可以使用關係的延遲載入,這塊的修改主要在配置檔案,還記得之前的Category類嗎?我們修改他的配置檔案Category.hbm.xml

 <set name="products" lazy="false">
        	<key column="cid" not-null="false"/>
        	<one-to-many class="com.vipcpi.Product"/>
        </set>
將其中的lazy="false"改為true,表示通過Category獲取的屬性product是延遲載入的。

測試程式碼:

//獲取id為1的資料
		Category cate=(Category) s.get(Category.class, 1);
		System.out.println("我是印表機1--------------");
		Set<Product> ps=cate.getProducts();
		for(Product p:ps){
			System.out.println(p.getName());
		}
		System.out.println("我是印表機2--------------");
當lazy為false時,列印結果:


當lazy為true時,列印結果:


通過上面兩類測試我們發現,當非延遲載入時,當session獲取資料庫中的一條記錄時,不僅是查詢了category表的資訊,也一併查了product_表的資訊和資料。

但是當為延遲載入時,只有在通過category獲取products的時候,才會查詢product_表的資訊,也就是說,載入某個實體時,會對這個實體中的集合屬性值採用延遲加(一對多)。再上升一點,就是在載入某個實體時,會對實體所單端關聯(one-to-many,many-to-one)的另一個實體物件採用延遲載入。

這就是延遲載入和非延遲載入的區別。

那麼,為什麼要用延遲載入呢?

延遲載入,也叫延遲例項化,延遲初始化等,它的主要作用就是,把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。

這塊,是不是想到了設計模式中的單利模式,分為的懶漢式和餓漢式