锁定老帖子 主题:还是Spring的事务
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-01-31
我的做法是:
1.DAO是对单表delete、update、edit、load和findByXXX的方法,其它方法都不需要。增删查改本身就是一个原子操作,不需要事务(当然也可能存在例外,不过很罕见)。 对于导航级别的查询,例如取得Company下面的所有Employee,其实一般只要调用compay.getEmployees()就可以了,如果担心hibernate lazy load的问题,对于不同的情况,可以有两种解决方法: (1)对于在service层对Dao的调用,可以配置一个spring的声明式的事务,只要有spring事务的上下文,就有hibernate的上下文,这样就不会出现延迟加载。 (2)对于在Controller层对Dao的调用,只能在EmployeeDao写一个findEmployeesByCompand的方法。 2.Service层是对多个表的复杂操作,通过调用其相应的DAO来完成。注意,Service层不需要HibernateDaoSupport--有了Dao,干吗还要hibernateDaoSupport? 在service的方法里面你可以通过调用各个表的Dao实现任意复杂的操作,需要事务否,则看情况而定,例如:假如没有两个以上(包括两个)的更改操作(create、delete、edit),则不需要事务;否则需要事务,而配置spirng的事务也极其简单,因为spring可以把任何的java bean纳入容器管理的事务。 3.Controller层可以调用Dao和Service层,其主要的功能是: (1)调用Dao和Service取得数据,把数据发送给View层。 (2)负责收集从View传过来的用户填写的表单数据、组装,然后将其作为Dao或Service层的调用参数。同时Controller层控制页面跳转。 (4)View层只负责解析和显示数据及收集用户填写的表单数据。 业务逻辑和事务逻辑封装在Dao层和Service层,事务的边界和业务的边界也在于此,而在view层或Controller层控制业务逻辑并企图开始和结束一个事务我认为是设计上的失败--当然,如果你不用spirng的XXXDaoSupport则例外。 --严重声明,上面所写的都不是金科玉律,具体情况还得具体分析(例如考虑性能等等)。规则是死的,人是活的。很笨人才会循规蹈矩一头撞死在树上。 |
|
返回顶楼 | |
发表时间:2005-01-31
DAO-->SERVICE-->MANAGER
DAO 层对数据库进行简单的CRUD。 SERVICE 层 获得DAO 然后事物 有spring管理。 MANAGER 层 web代理。 |
|
返回顶楼 | |
发表时间:2005-01-31
我没有使用spring时是这样的:
1)dao层中的方法都有一个参数为session 2)service层中管理session和事务 3)control层调用service dao中的一个方法是这样的: { session.save(obj); } 而如果用spring,这个方法是这样的: { getHibernateTemplate().save(obj); } 我没有看到spring可以为我带来什么方便和好处啊? 要不好处就是把 代码方式的事务管理 变成了 配置方式的事务管理? |
|
返回顶楼 | |
发表时间:2005-01-31
好处 不不用写 try catch finally。
有spring控制。配置更灵活。 |
|
返回顶楼 | |
发表时间:2005-01-31
我不喜欢事务放到DAO层。。。。它永远是被serivce层调用的。而且可能调用几个DAO。
所以喜欢把事务放到serivce层。 |
|
返回顶楼 | |
发表时间:2005-01-31
对于要调用DAO里几个方法的组合事务,可以在在DAO里定义一个诸如executeUnderCompositeTransaction(Callback callback)的方法,在callback里调用那几个方法,这样只需要让spring管理DAOBean的executeUnderCompositeTransaction方法的事务就可以了。放到action太麻烦。
|
|
返回顶楼 | |
发表时间:2005-01-31
大愚弱智 写道 我的做法是:
1.DAO是对单表delete、update、edit、load和findByXXX的方法,其它方法都不需要。增删查改本身就是一个原子操作,不需要事务(当然也可能存在例外,不过很罕见)。 大愚弱智 写道 业务逻辑和事务逻辑封装在Dao层和Service层,事务的边界和业务的边界也在于此。 可能我写得不是很清楚,实际上DAO需要事务的情形是非常少见的。所谓的“业务逻辑和事务逻辑封装在Dao层和Service层”只是为了说明在Controller层和View都看不到事务和业务,是为了界定事务和业务的边界而已。 |
|
返回顶楼 | |
发表时间:2005-03-17
事务放到action有一点方便的,免去property copy的工作。
不知道大家用Open Session In View当singleSession=false时,update 带有Collection Lazy load的对象,如果load, update不在一个session内就会报Illegal attempt to associate a collection with two open sessions错误,为了避免这个问题,只能将load跟update放在一个事务内,就很麻烦……我现在的做法就是对那些有Collection Lazy load的对象在Service层再Load一遍,然后copy properties,然后Update。 |
|
返回顶楼 | |