Hibernate框架-----屬性延遲載入和關係延遲載入(七)
阿新 • • 發佈:2019-01-08
屬性的延遲:
我們之前在獲取一條資料的時候採用的都是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是延遲載入的。
測試程式碼:
當lazy為false時,列印結果://獲取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為true時,列印結果:
通過上面兩類測試我們發現,當非延遲載入時,當session獲取資料庫中的一條記錄時,不僅是查詢了category表的資訊,也一併查了product_表的資訊和資料。
但是當為延遲載入時,只有在通過category獲取products的時候,才會查詢product_表的資訊,也就是說,載入某個實體時,會對這個實體中的集合屬性值採用延遲加(一對多)。再上升一點,就是在載入某個實體時,會對實體所單端關聯(one-to-many,many-to-one)的另一個實體物件採用延遲載入。
這就是延遲載入和非延遲載入的區別。
那麼,為什麼要用延遲載入呢?
延遲載入,也叫延遲例項化,延遲初始化等,它的主要作用就是,把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。
這塊,是不是想到了設計模式中的單利模式,分為的懶漢式和餓漢式。