公告



          <2006年7月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          延遲加載的對象:
          hibernate 2針對實體對象和集合
          hibernate 3同時提供了屬性的延遲加載功能。
          其中對集合的延遲加載特性意義最為重大。

          實體對象的延遲加載:
          1.在hibernate配置文件中的class指定

          集合類型的延遲加載:
          在set中指定lazy=true
          這樣只有實際加載與對象相關聯的集合對象的時候,再通過session從數據庫中加載實際的數據集。
          Hibernate.initialize方法可以強制Hibernate立即加載關聯的對象集,例如:
          Hibernate.initialize(user.getAddress());
          集合類型的緩存:
          如果為某個集合類設定了緩存,如
          <set
          ??? name="address"
          ??? table="t_address"
          ??? lazy="true"
          ??? ......
          >
          ??? <cache usage="read-only"/>
          ??? <key column="user_id" />
          ??? <one-to-many class="cn.blogjava.TAddress" />
          </set>
          Hibernate對集合類型進行緩存的時候,分兩部分保存。首先是這個集合中所有實體的id列表,其次才是各個實體對象。
          這里制定了cache usage="read-only"只會使得Hibernate對數據索引進行緩存。也就是說只緩存了集合中的數據索引,并不包含集合中的各個實體元素。
          如果指定cache usage="read-write"才會對集合中的實體進行緩存。

          屬性的延遲加載:
          在property節點中聲明lazy=true,而且還需要借助Hibernate類增強器對POJO類的二進制Class文件進行強化處理。

          ?

          hibernate中的Collection
          Hibernate對JDK Collention接口的獨立實現:
          由于傳統的Java Set, Map, List實現不能滿足要求,Hibernate根據這些接口提供了自己的實現。
          Hibernate的實現:
          無序集:Set, Bag, Map
          有序集:List
          Bag相當于一個允許重復元素存在的Set。
          因為Hibernate是自己的Collection實現,所以如下語句會出錯,
          Set hset = (HashSet)user.getAddresses();
          會在運行期報告一個java.lang.ClassCastException,因為實際上返回的是一個類型為org.hibernate.collention.Set的對象。
          所有我們在寫POJO時,必須用JDK Collection Interface(如Set, Map),而非特定的JDK Collection實現類(如HashSet, HashMap)聲明Collection型屬性的原因。例如:
          應該是private Set addresses;
          而不是private HashSet addresses;

          collection類型屬性的保存過程。
          例如
          public class TUser implements Serializable {
          ?private Set addresses = new HashSet();
          ??????? ......
          }

          然后創建一個TUser實例后,就可以為其添加關聯的address對象:
          TUser user = new TUser();
          TAddress addr = new TAddress();
          addr.setAddress("HongKong");
          user.getAddress().add(addr);
          session.save(user);
          user對象在經過Hibernate處理后發生了變化,首先,由于insert操作,產生了id值,并填充到user對象的id屬性,另一方面Hibernate使用了自己的collection實現對user中的HashSet型addresses屬性進行了替換,并用數據對其進行了填充。

          posted on 2006-07-16 10:31 knowhow 閱讀(463) 評論(0)  編輯  收藏 所屬分類: ORM:Hibernate及其他
          主站蜘蛛池模板: 武清区| 沈丘县| 县级市| 都昌县| 锦州市| 久治县| 赣州市| 新宾| 曲沃县| 南溪县| 南投县| 永修县| 宜丰县| 吴忠市| 门源| 通辽市| 长春市| 津南区| 义乌市| 沈阳市| 务川| 永德县| 武平县| 吉林省| 大同市| 工布江达县| 乌审旗| 治多县| 金山区| 张北县| 景洪市| 漳浦县| 江达县| 威远县| 利辛县| 湖北省| 独山县| 天津市| 介休市| 淮安市| 南汇区|