论坛首页 Java企业应用论坛

提问:关于使用lazy

浏览 12272 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-06-02  
没有道理拒绝层次清晰和结构优雅的设计。

PO不被传到View层道理是很明显的, 我也不希望写View的人去关心什么时候去打开和关闭一个Hibernate的Session。万一以后不用Hibernate呢?

在View层打开Session与把PO明显的传到View层几乎等价的,所以也是我希望避免的东西, 这是我问题的一个前提,没有这个前提,也就没有我的问题。没有问题,您还要回答什么?

我只是希望如果查询结果中的目标关联了很多只能在View层才能确定是否会用到的目标(导致数据库查询耗用资源太多), 我应该如何处理?这才是问题的实质。除了Lazy方式外,也许还有其他办法。
0 请登录后投票
   发表时间:2005-06-02  
楼主,请你用最简洁的话告诉大家,为什么你要避免PO传到view层?当然,前提,请你先简单讲一下为什么要使用Hibernate,什么是PO,PO有多少种状态,每种状态各代表了什么含义?ok,如果你对这些问题的答案和我一致,那么我们继续讨论,否则,没有任何意义。
0 请登录后投票
   发表时间:2005-06-02  
你用的是Struts,那么往页面传递数据用的应该也是FormBean了,FormBean的数据是在Acation中被设置的,此时要把PO中的数据复制到FormBean中,再传递到页面!

在Action返回之前,你的页面要显示的数据肯定是装载完成了吧? 这个时候关闭session,那么PO中的数据也不会出现Lazy=“true”的问题了吧?

但是这种方式也是不被推荐的,Action中不应该包含session.close() 等这样Hibernate的代码!所以现在大家用的最多的就是使用 Servlet的filter,在页面被初始化完成之后,把session关闭 !
0 请登录后投票
   发表时间:2005-06-02  
论坛上有这种方式的实现代码,可以找一下

也可以参考一下Spring 中的OpenSessionInView模式.
0 请登录后投票
   发表时间:2005-06-03  
如果不想OpenSessionInView的话. 可以把你需要的数据在Service上全部准备好,再放到页面上.
0 请登录后投票
   发表时间:2005-06-03  
谢谢 Morgan0916, 我已经在其它一些项目中使用你提到的在Filter中打开和关闭Session的方法。

正好上面有位提出为什么要避免把PO(当然我是指还处于一个Session的管理范围内的 Persistent Object, 而不是detached object 或 transient object), 在这个论坛上就有很多人提出了各自理由(如http://forum.iteye.com/viewtopic.php?t=4173),但是,我想能不能有一种机制/方式来避免直接传递所带来的问题,我正在考虑中,大概有一个模型,比较成熟的话,再拿来与大家共同探讨。
0 请登录后投票
   发表时间:2005-06-05  
dengyin2000 写道
如果不想OpenSessionInView的话. 可以把你需要的数据在Service上全部准备好,再放到页面上.


那就要多搞一个VO出来了......
0 请登录后投票
   发表时间:2005-06-05  
引用

但是,我想能不能有一种机制/方式来避免直接传递所带来的问题,我正在考虑中,大概有一个模型,比较成熟的话,再拿来与大家共同探讨。


如果你使用的是Hibernate,那么这种传递就没有问题,为什么你要再造出这样一套东西出来呢?Hibernate的PO有3种状态,Hibernate能够有效的维护这些状态,如果碰到前台的Formbean和PO不同的情况,你可以考虑在PO中加字段来解决。

有关使用lazy的问题,完全是你对hibernate的对象的操作的策略问题。如果是典型的WEB应用,应该不会成为问题。
0 请登录后投票
   发表时间:2005-06-06  
OpenSessionInView  就是要把PO的空间扩展到view层,为什么不能传递

java应用有关于domain model的讨论  楼主可以看看
0 请登录后投票
   发表时间:2005-06-06  
有这么多人回复,非常感谢各位!

我认为由于持久层和表现层可能是由不同的人/部门/单位 开发的,所以如果提供带状态的PO给表现层的开发人员的话,因为他们并不知道这个PO是带状态的,所以可能会临时的修改PO(比如:用于保存一些临时状态,而不希望真的将变化保存到数据库中),  由此而导致数据库不必要的修改,甚至出现其他意想不到的问题。

通过大家的回复,我好像看到现在很多人是赞成将带状态的PO(注意。我所说的不是detached object 或 transient object, 因为我要在表现层用到延迟加载)传递到View层的,这与我之前在这个论坛上得到的(大家就这个问题的观点)正好相反。

是原来的观点错误呢,还是因为什么其它原因? 那么赞成不要把PO直接传递到View层(而是先要转换成VO)的人,还能提供其他原因吗? 我记得Robbin好像也是反对直接传递的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics