gpt4 book ai didi

java - HibernateDaoSupport ,事务不回滚

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:49 24 4
gpt4 key购买 nike

我正在使用 Spring + Hibernate 和 PostgreSQL 进行一些“手动”事务管理在转向基于 aop 的事务管理之前,我想尝试一下并了解它是如何工作的。

@Repository
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {

@Override
public void saveUser(User u) {
Transaction tx = getSession().beginTransaction();
getHibernateTemplate().saveOrUpdate(u);
tx.rollback();

}
}

在这里调用 saveUser,我假设保存新用户将被回滚。然而,移动到 psql 命令行,用户被保存在表中。

为什么这没有回滚,我必须配置什么才能以这种方式进行交易?

编辑;更多的调试似乎表明 getHibernateTemplate() 使用的 session 与 getSession() 返回的 session 不同 (?)

将代码更改为

Transaction tx = getSession().beginTransaction();
getSession().persist(u);
tx.rollback();

并且事务确实被回滚了。但我仍然不明白为什么 hibernateTemplate 会使用/创建一个新 session ..

最佳答案

我想到了几种可能性(没有双关语意):

a) 您的 JDBC 驱动程序默认为 autocommit=true 并且以某种方式忽略了 beginTransaction() 和 rollback() 调用;

b) 如果您使用的是 Spring 3,我相信 SessionFactory.getSession() 返回由 Spring 代理包装的 Hibernate Session 对象。 Session 上设置了 Spring 代理,部分是为了处理事务管理,也许它会干扰您的手动事务调用?

虽然您当然可以使用 AOP 范围的代理进行事务管理,但为什么不在您的服务层方法上使用 @Transactional(readOnly=false|true) 注释呢?在你的服务层方法的 Spring 配置文件中,你需要做的就是添加

<tx:annotation-driven />

请分别参阅有关事务管理和 ORM 数据访问的 Spring 引用文档的第 10 章和第 13 章:

http://static.springsource.org/spring/docs/3.0.x/reference/index.html

最后,如果您使用的是 Spring 3,则可以通过将 Spring 代理的 SessionFactory bean 注入(inject)到您的 DAO 代码中来消除代码中对 Spring Framework 的引用——不再需要使用 HibernateDaoSupport。只需注入(inject) SessionFactory,获取当前 Session,然后根据 Hibernate 示例使用 Hibernate。 (如果需要,您可以在同一个应用程序中结合使用 HibernateDaoSupport 和普通的基于 SessionFactory 的 Hibernate 代码。)

关于java - HibernateDaoSupport ,事务不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com