【发布时间】:2014-06-30 07:55:19
【问题描述】:
我们有一个相当庞大的应用程序,它始于十年前,并且仍在积极开发中。所以有些部分仍然在 J2EE 1.4 架构中,其他部分使用 Java EE 5/6。
在测试一些新代码时,我意识到通过新旧代码部分传入的信息之间存在数据不一致,其中旧代码直接使用 Hibernate 会话,而新代码使用注入的 EntityManager。这导致了一个问题,一个部分看不到另一部分的新数据,因此也创建了一个数据库记录,导致违反主键约束。
计划完全迁移旧代码以摆脱 J2EE,但与此同时 - 我可以做些什么来协调两个部分之间的数据库访问?无论是通过 JPA 访问还是直接访问,在应用程序服务器中的某个时间点,这两种方式不应该在 Hibernate 层中结合在一起吗?
【问题讨论】:
-
我建议您引入数据库锁定,而不是会话事务级别隔离,因为它们由不同的连接管理。 @Version 之类的东西可能会有所帮助
-
嗯,我想知道在这种情况下,答案是否是使用分布式事务而不是锁定。它有点含糊,但我认为问题在于“旧代码”和“新代码”在隔离事务中不必要地工作,实际上应该在同一个事务中工作。
-
@Gimby:澄清一下,新旧部分中传入和处理的信息是分开的用例——我只需要一个共同的持久性上下文,以便两个部分看到相同的数据。
-
如果你有一个集中的方式在旧代码中获取会话,你可以考虑简单地修改它并从
EntityManager(或SessionFactory从EntityManagerFactory中提取休眠会话) )。 -
您使用的是 JavaEE 标准持久性吗?您的应用程序部署是否包含它自己的 Hibernate 副本?您是否在 Hibernate 配置中使用 JTA 事务管理器?如何管理事务分界?您是否为此目的使用(可能是无状态的)会话 bean?
标签: java database hibernate jakarta-ee jpa