2007-11-23
Dao控制事务设想,线程级事务处理
关键字: hibernate dao 事务
最近在重构公司的一个项目,在事务处理的问题上挺伤脑筋,主要就是业务层如何进行事务控制的问题,由于没有使用spring等可以声明式事务管理,所以只能手动进行,大家都知道事务不应该放在DAO层进行,那样进行多个DAO操作时则无法进行单一事务控制,但是我个人又不想把事务控制代码写在业务层,因为如果将这些代码放到业务层,那么业务逻辑中就包含了与业务无关的代码,不是我所愿意的,同时也造成了业务层与持久层的耦合,思前想后,后来想到一个办法,应该可以做到两全其美,就是还是使用DAO进行控制事务,但是并不一定是每个方法一个事务,文采不好,还是直接用代码表示吧。
DAO泛型接口
DAO通用实现
以上是比较典型的泛型DAO的实现,我只在其中增加了事务控制的方法,其中使用的HibernateUtil是通过ThreadLocal管理session的工具,我在其中增加了对Hibernate的Transaction类型的管理,和管理session一样,这样即使使用不同的DAO实现,在同一线程中都可用同一事务进行控制。
之所以这样做,是为了DAO多个操作可以共享一个事务,这种实现方式在业务层也不会耦合持久层的代码,可以说达到了我的目的,但是这种方式只是刚刚想到的,并没有经过测试,而且由于个人水平问题,肯定有想不到或者是想错的地方,希望各位高手给点意见,谢谢!
DAO泛型接口
public interface GenericDao <T, PK extends Serializable> {
PK create(T newInstance);
...
void beginTransaction();
void commit();
void rollback();
}
DAO通用实现
public class GenericDAOHibernate <T,ID extends Serializable, DAOImpl extends GenericDao>
implements GenericDao {
private Session session;
private Transaction tx;
@Override
public void beginTransaction() {
// TODO Auto-generated method stub
session = HibernateUtil.currentSession();
tx = HibernateUtil.currentTx();
tx.begin();
}
@Override
public void commit() {
// TODO Auto-generated method stub
tx.commit();
}
@Override
public void rollback() {
// TODO Auto-generated method stub
tx.rollback();
}
......
}
以上是比较典型的泛型DAO的实现,我只在其中增加了事务控制的方法,其中使用的HibernateUtil是通过ThreadLocal管理session的工具,我在其中增加了对Hibernate的Transaction类型的管理,和管理session一样,这样即使使用不同的DAO实现,在同一线程中都可用同一事务进行控制。
之所以这样做,是为了DAO多个操作可以共享一个事务,这种实现方式在业务层也不会耦合持久层的代码,可以说达到了我的目的,但是这种方式只是刚刚想到的,并没有经过测试,而且由于个人水平问题,肯定有想不到或者是想错的地方,希望各位高手给点意见,谢谢!
评论
calmness
2007-11-26
我试过了,行得通,但除了可以封装hibernate事务以外,没有其他实际好处,且无法处理service层的嵌套事务,还是用spring算了。
kekeemx
2007-11-26
好像可以行的通....找机会试试看
calmness
2007-11-23
补充一下,应该还增加一个release接口用于释放资源,如session等
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 116764 次
- 性别:

- 来自: 珠海

- 详细资料
搜索本博客
我的相册
1
共 9 张
共 9 张
最新评论
-
使用java实现http多线程下 ...
...版式有问题, 希望能耐心的看看,谢谢了哈
-- by 落花虽有意 -
使用java实现http多线程下 ...
看了你的思路我也写了个简单的,中间出了点问题想请教您,谢谢了``` 问题是这样 ...
-- by 落花虽有意 -
Python笔记之and or陷阱
Python 2.5中可以用 value1 if expression else ...
-- by victorsos -
使用java实现http多线程下 ...
不错,谢谢,学习一下!
-- by nighty -
记张学友演唱会让我愤怒的 ...
保安的行为有抢劫的嫌疑
-- by JavaInActoin






评论排行榜