应该持久化双向映射的哪一边

Which side of bidirectional mapping should be persisted

我在 SO 和几篇文章中寻找答案,但我认为很遗憾错过了明确的解释,所以我决定问一下。

假设我们有两个实体(盒子包含多个项目):

@Entity
@Table(name = "box")
class Box
{
    @Id
    private Long id;

    @OneToMany(mappedBy = "box")
    private List<Item> items = new LinkedList<>();
    
    public void addItem(Item item)
    {
        items.add(item);
        item.setBox(this);
    }
    // setters, getters, delete synchronize method
}
@Entity
@Table(name = "item")
class Item
{
    @Id
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "box_id")
    private Box box;

    // setters getters
}

我应该坚持感情的哪一方面?

  1. 是否取决于关系的拥有方?
  2. 是否取决于级联类型和拥有方没有共同点?
    1. CascadeType.PERSIST放入Box实体,然后em.persist(box)
    2. CascadeType.PERSIST放入Item实体,然后em.persist(item)
    3. 两者都有,persist 由我决定 - 可以是 em.persist(box)em.persist(item)

你可以坚持双方的关系。

如果持久化盒子实体,只需调用一次实体管理器的持久化方法并将盒子实体作为参数传递,使用项目实体列表,盒子项目参数必须有一个级联类型。

如果持久化item实体,则需要调用实体管理器的persist方法N次,即N个item,传递带有box参数的Item实体,box参数必须有级联类型。在第一个插入框不会有 ID,但是一旦你插入第一个项目,Box 就会有 ID,所以在接下来的 N-1 个项目中你将必须建立那个带有 Id 的框,因为如果没有,它将创建 N 个框。

基于所有这些我认为在大多数逻辑中最好保留父实体,cob 级联类型保留在代表与女儿 class 的关系的 属性 中。