使用不同的实体管理器(JPA/Eclipelink)读取和写入定义为两个不同持久实体的相同表

使用不同的实体管理器(JPA/Eclipelink)读取和写入定义为两个不同持久实体的相同表,jpa,entitymanager,Jpa,Entitymanager,这里有一个场景,我需要执行它来抛出乐观锁异常,以防在我从数据库读取数据和实际写回数据之间,下面发生了变化。我有一个项目,它定义了自己的持久性实体和单元。EntityManager是使用扩展持久性上下文定义的。它定义了一组持久性实体 现在我依赖于某个jar文件,这个jar文件还定义了一些持久性实体以及它自己的持久性单元(在persistence.xml文件中)和entityManager。这里的entityManager也是使用扩展持久性上下文定义的 这两个持久化单元都指向相同的数据库和相同的模式

这里有一个场景,我需要执行它来抛出乐观锁异常,以防在我从数据库读取数据和实际写回数据之间,下面发生了变化。我有一个项目,它定义了自己的持久性实体和单元。EntityManager是使用扩展持久性上下文定义的。它定义了一组持久性实体

现在我依赖于某个jar文件,这个jar文件还定义了一些持久性实体以及它自己的持久性单元(在persistence.xml文件中)和entityManager。这里的entityManager也是使用扩展持久性上下文定义的

这两个持久化单元都指向相同的数据库和相同的模式/库(DB2)。两个持久性单元之间有一些共同的持久性实体,即它们引用相同的基础表,但由于它们来自两个不同的JAR,因此它们具有不同的名称/包结构和定义为复合主键的一组不同的键

场景是,我需要从entityManager之一读取实体,然后使用不同的实体管理器写入/更新。因为我在一个事务中运行这个,所以持久性上下文会传播,但因为这是两个不同的持久性单元,每个单元为同一个基础表定义了不同的名称/包结构,所以即使我从其中一个读取数据并尝试从另一个保存数据,第二个实体管理器将其保存为一个新实体,就好像它在表中不存在一样。因此,即使在我从第一个实体管理器读取数据和尝试使用不同的实体管理器写入数据之间,数据库中同一行的数据发生了更改,它也不会抛出乐观锁异常,而是按原样保存数据


我尽了最大努力解释这个场景,但如果有疑问,请不要犹豫询问。另外,我相信如果有两个不同的PU为同一个基础表定义了具有不同名称的持久实体,那么就不能从一个em中读取,而让另一个em知道,因为基础表是相同的,因为这一行已经被不同的em读取,所以让我们按照第二个PU定义它的方式来转换这个实体,并且在尝试时,第二个em尝试首先比较表中的数据,如果第一个em第一次从同一个表中读取后发生了更改,并且如果发生了更改,则抛出乐观锁异常。

如果它们是不同的持久性单元,那么它们也可能是不同的数据库(实际上可能是)就申请而言。我不知道为什么在不同的持久性单元中的同一个表上会有一个完全不同的实体——是否有必要在工具中组合或重用持久性单元,并对其进行扩展?这将避免将相同的数据拉入两个不同的持久性单元所需的重复读取。至于从一个模块读取和写入到另一个模块,merge应该找出它是一个现有的实体。感谢快速响应@Chris-See,这两个模块由两个不同的团队管理,合并代码是不可能的,因为这两个模块都由两个不同的团队维护。另外,两个持久化单元都指向同一个数据库。明白了,只是指出您的团队在运行时复制了开销-连接、语句等。因此,请关注代码中出现的错误-您所说的“它保存它就像它不存在一样”到底是什么意思?它在做插页吗?你到底打什么电话?至于非乐观锁,它需要两个应用程序/持久化单元同意使用同一字段进行乐观锁。您确实需要更紧密的集成来实现这一点,而且似乎您最好使用他们的持久性类并在其上进行扩展,而不是编写自己的持久性类。请看,两者都是独立的模块,并且独立工作(每个持久性单元都是各自EAR项目的一部分),在一个场景中,一个项目只需要来自另一个项目的持久性项目(entities/em)。因此,我正在寻找的解决方案是在两个地方都注入相同的实体管理器,即在EAR自己的持久性项目中,以及在来自不同模块(不同EAR项目的一部分)的持久性项目中。我需要知道如何在运行时告诉使用哪个entity manager实现,因为我有2个entity manager实现1)被注入到同一个EAR的持久性项目中2)来自不同EAR的持久性项目中