两个EAR文件,相同的JPA实体管理器,同一个事务=>相同的会话?

Mau*_*uli 6 java distributed jpa transactions jpa-2.0

假设我有两个应用程序,每个应用程序都有一个单独的EAR文件,它们在同一个JTA事务中相互调用.如果两者共享同一个实体管理器,它们是否会获得相同的会话,或者每次都创建新会话?

dou*_*e-m 1

EntityManager(在 JPA 中)或多或少相当于 Session(在 Hibernate 中)。在纯 JPA 应用程序中,您将仅使用 EntityManager。它封装了一个Session。只要 EntityManager 存在,Session 就存在。

没有理由(我认为没有办法)在两个应用程序之间共享 EntityManager,因为它们在不同的 JVM 中运行(至少在我使用过的应用程序服务器上)。您可以做的是共享 EntityManager设置(称为持久性单元)。您可以通过将实体类和 XML 放入 JAR 中并从两个应用程序中使用它来完成此操作,但具体如何完成可能取决于您的应用程序服务器。它肯定会产生与为第二个应用程序复制类和 XML 完全相同的效果。

将会发生的情况是:两个应用程序中的每一个都将拥有自己的持久性上下文。这意味着,当您在一个应用程序中加载实体时,它不会在另一个应用程序中加载。如果您在应用程序一中加载并修改实体,然后在应用程序二中加载它,应用程序二将看到未修改的实体(除非您有非常奇怪的事务隔离设置并且应用程序一决定首先刷新实体)。

任何冲突只会在 JTA 事务结束时才会出现。我不知道接下来会发生什么,我认为这取决于你的数据库和事务设置。如果两个应用程序尝试对相同的数据执行不同的操作,则事务可能会回滚。每个应用程序都有自己的数据库连接。它们通过 JTA 事务绑定在一起,因此可以确保两者都提交或都回滚。