在Spring中使用JPA EntityManager和Hibernate会话与共享事务管理器

rab*_*azl 9 java spring hibernate jpa activiti

我们遇到了困难.

  1. 有一个大型项目使用hibernate特殊功能,因此无法退出休眠状态.
  2. 我们将以嵌入模式向项目添加Activiti流程引擎并使用JPA扩展(仅适用于EntityManager)
  3. 一些实体不应出现在JPA持久性单元中,因为作为activiti文档说所有实体必须具有@Id并且不能使用@ IdClass/@ EmbeddedId所以我们必须从持久单元中排除这些实体
  4. 我们希望为EntityManager和Session使用一个共享事务管理器.dataSources也是相同的(甚至是共享的)
  5. 一切都是春天!

所有这些努力都是为了让Activiti能够将EntityManager用于其JPA扩展,同时让现有的hibernate依赖代码继续工作.

jon*_*one 5

首先,如果您想拥有一个持久性单元并且您实际上在您的 Hibernate 实体中使用 @IdClass/@EmbeddedId,那么您上面的第三点可能很难适应。以下是两种可能的解决方案:

  1. 将 JPA 拉入您的项目并为您现有的 Hibernate 实体配置一个持久性单元,但继续通过直接访问 Session 将现有调用委派给 Hibernate。在这种情况下,您的配置将移至 JPA,但您的代码不会。这种方法还假设您有一些合理的抽象,以可插拔的方式分配 Session 对象。请参阅此问题以了解解决方案的关键。如果您对上述第 3 点的灵活性为零,则此方法可能不适合您。

  2. 创建会话工厂和持久性单元,并使用 JTA 与两个 XA 数据源协调事务。即使您的数据可能驻留在同一个数据库中,如果您采用这种方法,您也需要确保在您的配置中创建不同的数据源。这样可以防止 Spring 的事务代理在参与分布式事务的时候混淆。这可能是最干净的方法,但确实带有 XA 交易的耻辱,根据您的容器,如今这更像是一个政治问题而不是技术问题。