假设我有两个应用程序,每个应用程序都有一个单独的EAR文件,它们在同一个JTA事务中相互调用。如果两者共享同一个实体管理器,它们是否会获得相同的会话,或者每次都创建新会话?
答案 0 :(得分:1)
EntityManager(在JPA中)或多或少等同于Session(在Hibernate中)。在纯JPA应用程序中,您只能使用EntityManager。它封装了一个Session。只要EntityManager存在,会话就会存在。
没有理由(我认为没办法)在两个应用程序之间共享一个EntityManager,因为它们在不同的JVM中运行(至少在我使用过的应用程序服务器上)。您可以做的是共享EntityManager 设置(称为持久性单元)。您可以通过将实体类和XML放入JAR并从两个应用程序中使用它来实现,但是如何完成此操作可能取决于您的应用程序服务器。它肯定会与仅复制第二个应用程序的类和XML完全相同。
将会发生这样的情况:两个应用程序中的每一个都有自己的持久化上下文。这意味着,当您在一个应用程序中加载实体时,它将不会加载到另一个应用程序中。如果您在应用程序1中加载和修改实体,然后将其加载到应用程序2中,则应用程序2将看到未修改的实体(除非您有非常奇怪的事务隔离设置和应用程序决定刷新实体第一)。
任何冲突只会在JTA交易结束时浮出水面。我不知道接下来会发生什么,我认为这取决于您的数据库和事务设置。如果两个应用程序尝试对同一数据执行不同的操作,则事务可能会回滚。每个应用程序都有自己的数据库连接。它们通过JTA事务绑定在一起,因此可确保提交或同时回滚。