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 原文鏈接
閱讀:5 評論:0 查看評論