- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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/
我正在使用 Spring + Hibernate 和 PostgreSQL 进行一些“手动”事务管理在转向基于 aop 的事务管理之前,我想尝试一下并了解它是如何工作的。 @Repository pu
我最近一直在使用 Hibernate 3.5 和 Spring 3 做一些工作,我对 Hibernate 还很陌生,并认为 Spring 中的 HibernateDaoSupport 类使得在我的域中
我正在使用 spring 和 hibernate 编写一个 DAO public class DaoImpl extends HibernateDaoSupport implements Dao {}
如何在扩展的 DAO 类中执行下面的 native 查询 org.springframework.orm.hibernate3.support.HibernateDaoSupport nati
这里我添加了我的代码。当我尝试获取表列表时,try block 中出现问题。 数据库是MySql 异常是:java.lang.IllegalArgumentException:要遍历的节点不能为空!
我的 Web 应用程序使用 Struts2.3 + Spring 3.2.6 + Hibernate 3.X。 我正在使用注释来管理事务。我的 DAO 类如下。 @Transactional(read
您好 我正在使用 Spring+Hibernate 开发一个非 Web 应用程序。我的问题是 HibernateDaoSupport 如何处理延迟加载,因为在调用 do DAO 之后, session
在我正在开发的独立应用程序(单线程命令行工具)中,我使用 Spring + Hibernate。它有 DAO 和服务层,对于 DAO,我使用 HibernateDAOSupport。域模型中的集合是延
我的网络应用程序有问题。在文件 .java 中,我看到了 HibernateDaoSupport,并且所有测试都成功了。当我在服务器上运行应用程序时出现此错误 Caused by: java.lang
我正在使用 hibernate HibernateDaoSupport.getHibernateTemplate 并且我想在需要实现 IN 运算符行为的地方使用 find 方法。 getHiberna
我在很多论坛上看到过,但仍然很困惑。我们正在使用 Spring 3.1 和 Hibernate 4 启动一个新项目,需要决定使用 Spring 的 Hibernate 策略: 直接访问 Hiberna
您好,在我的域模型中, “家族”有很多“子家族”“亚科”有很多“轨迹” 并且关系是双向的,具有延迟加载。 即。 'Locus' 可以使用 alocus.getSubFamily() 在父级 'SubF
我是 jsf 2.0 spring 3.1 和 hibernate 4.1 集成的新手。我该如何更改以下代码,因为 hibernate 4.0 不包含 HibernateDaoSupport。 imp
我没有太多练习 Criteria,更没有练习过使用 Spring 类(例如 HibernateDaoSupport)。 我继承了一个项目,其中所有Dao都扩展了HibernateDaoSupport,
我正在尝试使用 getHibernateTemplate() 方法在 Hibernate 中编写自定义选择语句。我对生成的映射有疑问。 示例代码: List users = getHibernateT
我正在使用 spring 2.5 和 HibernateDaoSupport。我的疑问是,我是否仍然需要 Hibernate jar 文件来支持 HibernateDaoSupport。 我在 net
我得到一个异常(exception)说: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is
我是Java web开发,使用spring3.1.1+hibernate3.6.0+tomcat7.0.29 + mysql5.5,但是在我的服务器上运行后,Eclipse提示 HTTP Statu
我是一名优秀的程序员,十分优秀!