如何发挥Hibernate的lazy检索功能的作用?

06-02-22 XeroBuffer
Hibernate在操作对象关联时可以提供lazy检索的功能,例如Cutomer-->Orders,如果访问Cutomer本身,不需要访问Orders这时候,不需要返回所有和Customer关联的Orders对象。学习了一段实际间Hibernate,我现在越来越不知道该怎么使用这个功能了。

由于在Hibernate下有detached对象可以部分替代DTO,我通过DAO对象返回相应的detached object,但是这些detached对象只能在相应的Session close之后才可以作为detached object返回。这样就出现了矛盾,因为session close之后,lazy功能就不能起作用了。因为调用DAO的客户是否真的要访问Customer关联的Orders对象,DAO本身并不知道,如果在DAO相关代码中使用的lazy功能,而客户端却访问了相关的orders对象,这会抛出异常,因为相应的orders还没有初始化。如果在DAO中显式初始化orders则,lazy检索的意义何在?难道说对每一个DAO里面的find方法都定义多个版本(包括显式初始化orders和使用lazy检索orders的版本),然后客户端只能通过调用不同的版本?

以上是我对Hibernate的lazy检索功能的一点疑问,不知道是我的理解错误,还是使用上方法不当。请各位指点,谢谢!

banq
2006-02-25 17:57
需要open session in view,自己做个servletFilter,在servletFilter中操作session的关闭。个人认为这是一种反模式。

http://www.jdon.com/jive/thread.jsp?forum=62&thread=22374&message=13120585

XeroBuffer
2006-02-27 13:42
哦,原来还有Open-Session-In-View这么个东西,刚接触Hibernate还真不知道,Spring也提供了一种实现方式,随后我试试。

用了一段时间,感觉Hibernate和JDBC相比优势并不想宣传的那么明显,很多地方仍然需要额外代码,最重要的是没有JDBC那么灵活,而且总感觉性能上不太放心,不过没有专门作个这方面的测试,不知道有没有客观的性能对比的数据。

vcshcn
2006-04-06 00:47
我不喜欢sessioninview,总感觉数据库的操作就应该在db层完成,而不要拖拉到view中完成.所以我一般都不用lazy.而用.hbm.xml中的配置完成

猜你喜欢