Hibernate Session

时间:2016-11-09 10:54:55

标签: spring hibernate jpa transactions spring-data-jpa

我正在开发一个使用Spring框架(4.3.3.RELEASE)和Hibernate(5.2.3.Final)的项目,我开始使用Spring Data JPA。

我刚刚使用LocalSessionFactoryBean配置将HibernateTransactionManager迁移到使用LocalContainerEntityManagerFactoryBeanJpaTransactionManager HibernateJpaSessionFactoryBean的{​​{1}}的JPA配置。

使用来自Session的{​​{1}} s的现有hibernate代码似乎工作正常,直到我测试了一些代码执行一个实体的保存,然后在同一个事务中运行一些更新查询代码在更新sql上失败:

SessionFactory

事务管理器日志显示事务处于活动状态然后回滚,这很奇怪。 然后我注意到保存操作已到达数据库。

在调试时我可以看到会话对象似乎没有任何事务对象,所以似乎hibernate会话没有使用或使用配置的javax.persistence.TransactionRequiredException: Executing an update/delete query 事务。

当我配置标记为主要JpaTransactionManager的其他事务管理器(HibernateTransactionManager)时,代码会起作用。

继续前进,当我将代码迁移到Spring Data Jpa时,我将希望在同一个Transaction中使用一些基于Hibernate的Dao代码和一些Spring Data Jpa Repository。如何让会话工厂使用PlatformTransactionManager

更新

我现在发现上面的配置意味着事务管理器不会将会话刷新到数据库,因此无法正常工作。

我还发现如果我将EntityManager注入我的Daos:

JpaTransactionManager

并使用:

@PersistenceContext()
private EntityManager entityManager;

然后代码正确地参与了事务。但是如果我得到entityManager.unwrap( Session.class ) (从春天注入,或从SessionFactory解包,或者从展开的entityManagerFactory使用getSessionFactory())并调用Session它返回未连接到事务的其他Session对象。

我的配置:

getCurrentSession()

0 个答案:

没有答案