论坛首页 Java企业应用论坛

还是Spring的事务

浏览 12962 次
精华帖 (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则例外。


--严重声明,上面所写的都不是金科玉律,具体情况还得具体分析(例如考虑性能等等)。规则是死的,人是活的。很笨人才会循规蹈矩一头撞死在树上。
0 请登录后投票
   发表时间:2005-01-31  
DAO-->SERVICE-->MANAGER

DAO 层对数据库进行简单的CRUD。

SERVICE 层 获得DAO 然后事物 有spring管理。

MANAGER 层 web代理。
0 请登录后投票
   发表时间:2005-01-31  
我没有使用spring时是这样的:
1)dao层中的方法都有一个参数为session
2)service层中管理session和事务
3)control层调用service

dao中的一个方法是这样的:
{
    session.save(obj);
}
而如果用spring,这个方法是这样的:
{
    getHibernateTemplate().save(obj);
}

我没有看到spring可以为我带来什么方便和好处啊?
要不好处就是把 代码方式的事务管理 变成了 配置方式的事务管理?
0 请登录后投票
   发表时间:2005-01-31  
好处  不不用写 try catch finally。

有spring控制。配置更灵活。
0 请登录后投票
   发表时间:2005-01-31  
我不喜欢事务放到DAO层。。。。它永远是被serivce层调用的。而且可能调用几个DAO。

所以喜欢把事务放到serivce层。
0 请登录后投票
   发表时间:2005-01-31  
对于要调用DAO里几个方法的组合事务,可以在在DAO里定义一个诸如executeUnderCompositeTransaction(Callback callback)的方法,在callback里调用那几个方法,这样只需要让spring管理DAOBean的executeUnderCompositeTransaction方法的事务就可以了。放到action太麻烦。
0 请登录后投票
   发表时间:2005-01-31  
大愚弱智 写道
我的做法是:
1.DAO是对单表delete、update、edit、load和findByXXX的方法,其它方法都不需要。增删查改本身就是一个原子操作,不需要事务(当然也可能存在例外,不过很罕见)。

大愚弱智 写道

业务逻辑和事务逻辑封装在Dao层和Service层,事务的边界和业务的边界也在于此。


可能我写得不是很清楚,实际上DAO需要事务的情形是非常少见的。所谓的“业务逻辑和事务逻辑封装在Dao层和Service层”只是为了说明在Controller层和View都看不到事务和业务,是为了界定事务和业务的边界而已。
0 请登录后投票
   发表时间: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。
0 请登录后投票
论坛首页 Java企业应用版

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