0

我定义了以下关系

实体 A 与实体 B 具有 @OneToMany,而实体 B 与实体 C 具有 @OneToOne。

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

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

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

4

1 回答 1

0

如果在非托管实例上调用 persist,JPA 要求提供者抛出异常。只能使用合并,因为很明显它从实例中获取数据并将其合并到托管副本中。如果 B 是托管的,persist 调用将被忽略,因此这意味着 B 是如何分离的,或者它是在与您调用 persist 不同的 entityManager 中读取的。

于 2013-02-06T12:32:36.947 回答