Ale*_*ühl 5 java database hibernate jpa java-ee
我们有一个巨大的应用程序,它始于十年前,并且仍在积极开发中.所以有些部分仍然在J2EE 1.4体系结构中,其他部分则使用Java EE 5/6.
在测试一些新代码时,我意识到通过新旧代码部分进入的信息之间存在数据不一致,旧代码直接使用Hibernate会话而新代码注入了EntityManager.这导致了一个问题,即一部分无法从另一部分看到新数据,因此也创建了数据库记录,导致主键约束违规.
计划完全迁移旧代码以摆脱J2EE,但与此同时 - 我可以做些什么来协调这两个部分之间的数据库访问?并且不应该在应用服务器中的某个时刻在Hibernate层中两种方式结合在一起,无论是通过JPA还是直接访问?
如果您分别实例化SessionFactory旧代码和EntityManagerFactory新代码的 a ,则可能会导致一级缓存中的值不同。如果在单个 Http 请求期间,您更改了旧代码中的值,但没有立即提交,则该值将在会话缓存中更改,但在提交之前它将不可用于新代码。独立于保护持久值的任何事务或数据库锁定,两个不同 Hibernate 会话的混合可能会给内存值带来奇怪的结果。
我承认注入的EntityManager仍然使用Hibernate。恕我直言,最强大的解决方案是获取EntityManagerFactoryforPersistenceUnit并将其转换为 Hibernate EntityManagerFactoryImpl。然后就可以直接访问底层了SessionFactory :
SessionFactory sessionFactory = entityManagerFactory.getSessionFactory();
Run Code Online (Sandbox Code Playgroud)
然后,您可以在旧代码中安全地使用它SessionFactory,因为现在它在您的应用程序中是唯一的,并且在新旧代码之间共享。
您仍然需要处理会话创建关闭和事务管理的问题。我想它已经在旧代码中实现了。在不了解更多信息的情况下,我认为您应该将其移植到 JPA,因为我很确定如果EntityManager存在,sessionFactory.getCurrentSession()就会给出其底层Session,但我不能肯定任何相反的东西。
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |