H3提供了很多令人興奮的特性,從RC1提供download開始便在機器上創建了新的H3test project,由于時間問題,H3的E文doc也只看到第五章節(都是打印A4紙閱讀的,飯前廁中枕邊 苦~),而且一直到前天才開始正式代碼移植...
這兩天感受并不多,本來沒想發到Javaeye,但是關于H3的lazy機制,覺得還是有點費解,并不是機制本身,而是其進行如此大的變動的目的
從H2到H3,在下目前接觸到的只有兩點比較重要(包名更改比較容易,批量替換吧):
1.session interface API的變更 find/iterate 等一些method在H3中已經不再支持 但是在org.Hibernate.classic.Session這個接口還是為用戶提供了以上的method,但是我想classic也不是長久之策,呵呵,以Gavin的觀點,所有的query操作,createQuery()才是王道
2.Lazy機制,這個就比較迷茫的...
看看測試代碼先
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會得到LazyInitializationException錯誤,也就是說,在H3里,session.close()之前,如果未對PO進行操作,那么PO實際上只是proxy,It's so interesting,由于沒有對H3有很深的理解,在下花了很長時間,最后在hibernate的論壇中找到了以上答案,對于H3為什么采用這種新的Lazy機制,目前
還不敢亂下結論 但看到Gavin 對用戶釋疑時這樣說:
Stop arguing with me, and obey the migration guide!
想來應該有一定道理的(還是文檔看的少,時間啊時間- -!)
也許你還是懷念H2中的一次性load出PO而不是proxy,那么在hbm文件中的class 中聲明lazy="false"來實現,請注意這是H3中新的屬性設置,而且它的默認值是"lazy="true"";或者采用控制session生命周期的方法,把它交給filter來控制,兩種方法只是個人拙見,希望各位指正
嗯,關于Lazy問題在Hibernate官方論壇的帖子
http://forum.hibernate.org/viewtopic.php?t=939532&postdays=0&postorder=asc&start=0
Hibernate3 Migration Guide 持續更新的,H2->H3用戶必看,可惜為什么等我都找到答案才發現這個頁面呢?sigh
http://www.hibernate.org/Documentation/Hibernate3MigrationGuide#A7
作者:mixer_a 發表于2012-4-10 22:36:21
原文鏈接