寻求ssh架构策略

现在网上流传的很多ssh架构的系统,包括开源的一些应用系统,很多都用了openSessionInView模式,这样一来,整个编程过程将大大简化。session的生命周期在整个请求范围内有效。我们可以把dao查询出来的有延迟加载属性的对象传递到页面中去。
但是在页面输出内容多的情况下,filter会使用页面缓冲区,这时filter的执行时间就和用户的网速有关,因此openSessionInview有可能造成数据库连接不能及时释放的问题。

如果不使用openSessionInView,那么我们一般会配置service层的方法使用事务,也就是说我们要在service层将所有延迟加载的属性
都取出来,放到vo中去,这样我们就需要建一系列的vo对象。严格的说,我们要在service层实现vo和po的转换。

保存数据时
action :获取formbean,将formbean转换为vo,save(vo)
service: vo->po,dao.save(po) (service层的curd方法都需要用vo做参数?)

查询数据时
dao:getList()
servce:遍历list,将list的每一个po转换为vo,有时需要处理po中的明细属性
(这样vo和po的转换将带来很多额外的工作。有时感觉很多余。)

另外有人提出用formbean作为vo,但是formbean是struts的东西,这样vo就和struts耦合,感觉不合理,最重要的是formbean反应的是form提交时的属性,但是查询列表里的对象可能和他的属性并不一样,除非构造一个冗余的formbean来处理输入和输出。(vo和form的关系)
[该贴被admin于2009-02-24 14:57修改过]

可参考本站的 OSIV(openSessionInview)多个讨论,讨论来讨论去,又回到EJB的EntityManager上,解铃还得系铃人,这个问题还得有Hibernate创建者King通过Seam 结合EJB来一个恰当解决。

lazy的话,如果web和app不在一个容器里怎么办?所以我觉得构造适当的组合对象是必要的,领域对象有时候能直接扔进web,有时候就不是恰当的,需要造一个用于web展现的对象来组合/剪裁这些领域对象。

有种方法是将session生命周期绑定为managed,再用应用层的拦截器来实现关注点分离和openSessionInConversation。