如果在关系上使用 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/