java - 双向 OneToOne 关系不对称保存?

标签 java jpa orm relation ebean

如果在关系上使用 PERSIST 级联类型,在所有者端或另一端保存实体有什么区别吗?

@Entity
public class Slot {
    @OneToOne(mappedBy = "slot", cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    private Cartridge cartridge;
}

@Entity
public class Cartridge {
    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    private Slot slot;
}

问题:

slot.setCartridge(cartridge);
slot.save();

对比

cartridge.setSlot(slot)
cartridge.save();

slot.save() 或 cartridge.save() 似乎不一样......

两个实体都已保存。我只是想设置它们之间的关系。

最佳答案

Cartridge 拥有关系,这意味着必须设置 cartridge.slot 值才能在大多数提供程序中更新外键。 JPA 规范还指出,您应该维护双向关系的双方,以使它们与数据库中的内容保持同步 - 因此,如果您的 setCartridge 也没有以某种方式设置关系的另一方,那么当您下次阅读弹药筒时, 它可能没有设置插槽。 JPA 取消了旧 EJB 规范中的关系维护,使实体的行为尽可能像常规 Java 对象。

你应该这样调用:

slot.setCartridge(cartridge);
cartridge.setSlot(slot)

然后保存在插槽或盒式磁带上——这无关紧要,因为合并会在任一方向上级联到引用的对象。

关于java - 双向 OneToOne 关系不对称保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13514760/

相关文章:

java - 无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery

python - 向后与 Django 中的代理模型建立多对多关系

java - hibernate 应用程序是域驱动的吗?

java - 使用compareTo 方法按字母顺序对ArrayList 中的新条目进行排序

java - HibernateUtil 与带注释的类相关的问题

Java:通过扩展添加 float

Java 对象值数组

java - Grails 项目 : Gorm or JPA/Hibernate annotations for legacy db mapping?

hibernate - 使用带有 hibernate 和 spring data jpa 的entityManager.getReference() 获取实体代理时避免不必要的 SQL 选择查询

php - 获取日期范围的查询结果