struts+spring+hibernate做项目的困惑

使用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


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值