使用struts+spring+hibernate做项目的困惑
环境:
spring:1.1
hibernate:2.1.6
strut:1.2.4
在做这个项目前,我们一直用servlet+jsp+javabean+jdbc开发系统,开发过程简单,效率也还可以,但就是sql写的太多,后期维护的工作量越来越大。而且PO基本上是table的一个对应,PO之间没有类的关系。在前期系统分析,基本上是做数据结构分析,功能分析等。
在做现在这个项目,我坚决按照面向对象分析系统,一个迭代过程中产生4种图:用例图、类图、序列图,和页面流程图。
开发过程:
1、按照分析的结果,形成PO,并且在PO上添加hibernate doclet,然后生成Mapping文件,生成数据库结构。这时候的PO之间的关系完全按照现实中的事物之间的关系构造的。
2、PO做完后,就做DAO的接口,在对接口做测试类,然后利用spring提供的hibernateTemplate封装了数据库数据分页,然后实现了DAO接口类。
3、做业务类,过程也是按照接口,测试类,实现类的过程做
4、表现层,也就是Struts,没有什么说的。
现在遇到的下列问题:
1、我的PO都是按照对象关系来建立的,因此用hibernate查询的时候,一个查询竟然涉及到9个表,有可能是A和B、c有关系,而B又和D有关系,等等。这样一个很长的left join,我觉得对效率有很大的影响。
2、用Struts,用ActionForm做VO,就存在转换的问题,因为PO是面向对象的,而ActionForm是和表现对应的,一般来说我都将几个PO要显示的属性合成一个ActionForm,这样就带来了转换的问题,麻烦!!!用BeanUtils的copy,又出现问题,lazy initiation错误,尽管我不copy lazy的属性。于是我只有封装BeanUtils,指定那些不用copy,那些要copy的。还有PO的hashcode(),我只有将非lazy=true的属性写到hashcode中。
3、从ActionForm到PO时,还有个问题,就是ActionForm的信息不全,我通常只有从数据库Load一个对象,然后在copy属性,然后在dao.save(obj)。这样的效率有没有影响?
4、因为将事务交给Spring 容器管理,因此,一些需要共享事务的原子操作,我就只有利用HibernateCallback对象,将一个大操作的select ,delete,insert ,update都放在callback里面,我不知道有没有比这更好的方式?
谢谢大家。
上面的几个问题,我说说我的看法:
1、Hibernate的PO设计原则是尽量的fine-grained的,一次关联9张表,那就要考虑设计的思路是否出问题了。
2、在Web层/Client层放弃DTO,直接渲染PO,带来的Lazy loading问题。对于纯Web应用,可以应用OpenSessionInView模式,对于Client应用通过Hessian访问服务器端Service组件,我的建议则是把对象关联操作封装到DAO接口上去,例如:
Parent.getChildren();
相应的在ParentDAO增加:
java代码:
ParentDAOImpl.getChildren(parent) {
getHibernateTemplate().initialize(parent.getChildren());
return parent.getChildren();
}
在Client端取某parent的children的时候,不要直接调用parent.getChildren(),而改用Hessian调用parentDAO.getChildren(parent)。
3、Spring管理的事务问题
我觉得你还没有真正理解Spring的事务管理机制。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=378897