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,its 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
