H3提供了很多令人興奮的特性,從RC1提供download開始便在機(jī)器上創(chuàng)建了新的H3test project,由于時(shí)間問(wèn)題,H3的E文doc也只看到第五章節(jié)(都是打印A4紙閱讀的,飯前廁中枕邊 苦~),而且一直到前天才開始正式代碼移植...
這兩天感受并不多,本來(lái)沒(méi)想發(fā)到Javaeye,但是關(guān)于H3的lazy機(jī)制,覺得還是有點(diǎn)費(fèi)解,并不是機(jī)制本身,而是其進(jìn)行如此大的變動(dòng)的目的
從H2到H3,在下目前接觸到的只有兩點(diǎn)比較重要(包名更改比較容易,批量替換吧):
1.session interface API的變更 find/iterate 等一些method在H3中已經(jīng)不再支持 但是在org.Hibernate.classic.Session這個(gè)接口還是為用戶提供了以上的method,但是我想classic也不是長(zhǎng)久之策,呵呵,以Gavin的觀點(diǎn),所有的query操作,createQuery()才是王道
2.Lazy機(jī)制,這個(gè)就比較迷茫的...
看看測(cè)試代碼先
java代碼:
HBM文件:
<hibernate-mapping package="h3test.example.db.PO">
<class name="UsERPO" table="users" >
<id name="id"
type="long"
column="ID">
<generator class="increment"/>
</id>
<property name="name" type="string"/>
<property name="nickname" type="string"/>
<property name="vip" column="isVIP" type="boolean"/>
</class>
</hibernate-mapping>
代碼
UserPO u=(UserPO)op.getSession().load(UserPO.class,new Long(3));
op.close();
System.out.println(u.getName());
以上代碼在H3會(huì)得到LazyInitializationException錯(cuò)誤,也就是說(shuō),在H3里,session.close()之前,如果未對(duì)PO進(jìn)行操作,那么PO實(shí)際上只是proxy,It's so interesting,由于沒(méi)有對(duì)H3有很深的理解,在下花了很長(zhǎng)時(shí)間,最后在hibernate的論壇中找到了以上答案,對(duì)于H3為什么采用這種新的Lazy機(jī)制,目前
還不敢亂下結(jié)論 但看到Gavin 對(duì)用戶釋疑時(shí)這樣說(shuō):
Stop arguing with me, and obey the migration guide!
想來(lái)應(yīng)該有一定道理的(還是文檔看的少,時(shí)間啊時(shí)間- -!)
也許你還是懷念H2中的一次性load出PO而不是proxy,那么在hbm文件中的class 中聲明lazy="false"來(lái)實(shí)現(xiàn),請(qǐng)注意這是H3中新的屬性設(shè)置,而且它的默認(rèn)值是"lazy="true"";或者采用控制session生命周期的方法,把它交給filter來(lái)控制,兩種方法只是個(gè)人拙見,希望各位指正
嗯,關(guān)于Lazy問(wèn)題在Hibernate官方論壇的帖子
http://forum.hibernate.org/viewtopic.php?t=939532&postdays=0&postorder=asc&start=0
Hibernate3 Migration Guide 持續(xù)更新的,H2->H3用戶必看,可惜為什么等我都找到答案才發(fā)現(xiàn)這個(gè)頁(yè)面呢?sigh
http://www.hibernate.org/Documentation/Hibernate3MigrationGuide#A7