首页 新闻 会员 周边 捐助

Java持久层混合使用

0
悬赏园豆:50 [已解决问题] 解决于 2015-05-25 09:02

有这样一个方法

@Transaction
public void action() {
       hibernate.xxx();
       mybatis.xxx();
       jdbctemplate.xxx();
}

问题

   1.这三个对象会使用同一个 数据库链接吗?

   2.Transaction 会起到作用吗?

   3.这三个对象是各自调用xxx方法 就commit, 还是 离开 action 方法时 才 commit ?

过于执著的主页 过于执著 | 菜鸟二级 | 园豆:339
提问于:2015-05-23 14:24
< >
分享
最佳答案
0

1、是的

2、会的

3、分别commit的

收获园豆:50
女孩,加油 | 小虾三级 |园豆:1098 | 2015-05-23 14:41

分别 commit 的话, Transaction 还能起作用, 那这个事务是怎么工作的?

过于执著 | 园豆:339 (菜鸟二级) | 2015-05-23 14:46

@过于执著: 不好意思,刚说错了 答案是:1、会  2、会  3、调用就连

女孩,加油 | 园豆:1098 (小虾三级) | 2015-05-23 15:03
其他回答(1)
0

上面几位的回复,

1.会,2 会 我没意见

3.我觉得不能笼统的回复,这要具体情况具体分析的,hibernate/mybatis是可以通过spring来统一管理事务,如果hibernate/mybatis都配置成使用同一个事务管理器,是在最后离开action时统一提交的。我曾经就在项目中,将hibernate与mybatis混用,交给spring使用同一事务管理器来统一管理事务。

菩提树下的杨过 | 园豆:556 (小虾三级) | 2015-05-25 16:21

补充一下,其实这个问题很容易验证的,这个问题说白了,就是三种不同机制的DAL技术,能不能控制事务是否统一管理,为简化问题,只保留2种就足够了(2种验证通过的话,3种,4种,N种自然也可以)。

假如保留hibernate/mybatis这二种,二者都insert同样的记录(主键刻意相同),如果是分开提交的,那么,执行完以后,hibernate在前在,commit成功,mybatis失败,最终 db里会有一条记录。

 

如果用spring配置成二者使用相同的事务管理器,由于是同一个事务,mybatis的失败,会导致hibernate的事务也回滚,最终db中一条记录都没有.

支持(0) 反对(0) 菩提树下的杨过 | 园豆:556 (小虾三级) | 2015-05-25 16:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册