9

我们处境艰难。

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

所有这些努力都是为了让 Activiti 能够将 EntityManager 用于其 JPA 扩展,同时让现有的休眠相关代码继续工作。

4

1 回答 1

5

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

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

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

于 2012-12-21T16:54:59.140 回答