两个EAR文件,同一个JPA entitymanager,同一个transaction => 同一个session?

6
假设我有两个应用程序,每个应用程序都有一个单独的EAR文件,在同一JTA事务中相互调用。如果它们共享相同的entitymanager,它们会获得相同的会话还是每次都创建新的会话?

应用程序共享类文件吗? - Michael Wiles
是的,实体和一些常见的API。 - Mauli
你是否已经配置了你的EntityManager以使用扩展持久化上下文? - Dave
1个回答

1

EntityManager(在JPA中)与Session(在Hibernate中)基本上是等效的。在纯JPA应用程序中,您只会使用EntityManager。它封装了一个Session。Session的生命周期与EntityManager相同。

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接