具有新关系的JPA 2.0实体更新在持久化时失败但在合并时成功

时间:2013-02-05 22:09:10

标签: jpa-2.0 eclipselink

我定义了以下关系

实体A的@OneToMany与实体B一起拥有@OneToOne和实体C.

在为实体A创建时,我还创建实体B并设置它们之间的关系。一切都按预期工作。

在另一笔交易中, - 从DB获取实体A,然后获取相应的实体B. - 创建实体C. - 在实体B上设置实体C以伪造两者之间的关系。 如果我使用EntityManager.persist(实体B),持久性管理器会再次尝试将实体B插入数据库,从而导致实体B的PK出现唯一约束违规。 如果我使用EntityManager.merge(实体B),一切都按预期工作。

在上面的使用环境中,为什么持久化操作会尝试创建副本,因为在这种情况下管理实体并且它应该能够轻松地进行更新。

1 个答案:

答案 0 :(得分:0)

如果在非托管实例上调用persist,则JPA要求提供程序抛出异常。只能使用合并,因为很明显它从实例获取数据并将其合并到托管副本中。如果B被管理,那么持久化调用将被忽略,因此它意味着某些B如何被分离,或者它是在与你持久调用的实体管理器不同的实体管理器中读取的。