posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          hibernate延遲加載

          Posted on 2007-09-07 15:05 semovy 閱讀(560) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate

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

          實(shí)體對(duì)象的延遲加載:
          1.在hibernate配置文件中的class指定

          集合類型的延遲加載:
          在set中指定lazy=true
          這樣只有實(shí)際加載與對(duì)象相關(guān)聯(lián)的集合對(duì)象的時(shí)候,再通過session從數(shù)據(jù)庫中加載實(shí)際的數(shù)據(jù)集。
          Hibernate.initialize方法可以強(qiáng)制Hibernate立即加載關(guān)聯(lián)的對(duì)象集,例如:
          Hibernate.initialize(user.getAddress());
          集合類型的緩存:
          如果為某個(gè)集合類設(shè)定了緩存,如
          <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對(duì)集合類型進(jìn)行緩存的時(shí)候,分兩部分保存。首先是這個(gè)集合中所有實(shí)體的id列表,其次才是各個(gè)實(shí)體對(duì)象。
          這里制定了cache usage="read-only"只會(huì)使得Hibernate對(duì)數(shù)據(jù)索引進(jìn)行緩存。也就是說只緩存了集合中的數(shù)據(jù)索引,并不包含集合中的各個(gè)實(shí)體元素。
          如果指定cache usage="read-write"才會(huì)對(duì)集合中的實(shí)體進(jìn)行緩存。

          屬性的延遲加載:
          在property節(jié)點(diǎn)中聲明lazy=true,而且還需要借助Hibernate類增強(qiáng)器對(duì)POJO類的二進(jìn)制Class文件進(jìn)行強(qiáng)化處理。

           

          hibernate中的Collection
          Hibernate對(duì)JDK Collention接口的獨(dú)立實(shí)現(xiàn):
          由于傳統(tǒng)的Java Set, Map, List實(shí)現(xiàn)不能滿足要求,Hibernate根據(jù)這些接口提供了自己的實(shí)現(xiàn)。
          Hibernate的實(shí)現(xiàn):
          無序集:Set, Bag, Map
          有序集:List
          Bag相當(dāng)于一個(gè)允許重復(fù)元素存在的Set。
          因?yàn)镠ibernate是自己的Collection實(shí)現(xiàn),所以如下語句會(huì)出錯(cuò),
          Set hset = (HashSet)user.getAddresses();
          會(huì)在運(yùn)行期報(bào)告一個(gè)java.lang.ClassCastException,因?yàn)閷?shí)際上返回的是一個(gè)類型為org.hibernate.collention.Set的對(duì)象。
          所有我們?cè)趯慞OJO時(shí),必須用JDK Collection Interface(如Set, Map),而非特定的JDK Collection實(shí)現(xiàn)類(如HashSet, HashMap)聲明Collection型屬性的原因。例如:
          應(yīng)該是private Set addresses;
          而不是private HashSet addresses;

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

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

          主站蜘蛛池模板: 夏津县| 壶关县| 鹤庆县| 锦州市| 汉中市| 绵阳市| 杭锦旗| 四会市| 玛纳斯县| 平度市| 屯昌县| 永嘉县| 商洛市| 怀来县| 莒南县| 清远市| 白朗县| 大足县| 武威市| 云阳县| 隆回县| 威海市| 通城县| 青田县| 华亭县| 江安县| 五河县| 澳门| 富民县| 霸州市| 临猗县| 大关县| 鹤岗市| 定陶县| 马关县| 和林格尔县| 昆山市| 扶风县| 文安县| 泽州县| 漳浦县|