应该持久化双向映射的哪一边
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
}
我应该坚持感情的哪一方面?
- 是否取决于关系的拥有方?
- 是否取决于级联类型和拥有方没有共同点?
- 将
CascadeType.PERSIST
放入Box
实体,然后em.persist(box)
- 将
CascadeType.PERSIST
放入Item
实体,然后em.persist(item)
- 两者都有,
persist
由我决定 - 可以是 em.persist(box)
或 em.persist(item)
你可以坚持双方的关系。
如果持久化盒子实体,只需调用一次实体管理器的持久化方法并将盒子实体作为参数传递,使用项目实体列表,盒子项目参数必须有一个级联类型。
如果持久化item实体,则需要调用实体管理器的persist方法N次,即N个item,传递带有box参数的Item实体,box参数必须有级联类型。在第一个插入框不会有 ID,但是一旦你插入第一个项目,Box 就会有 ID,所以在接下来的 N-1 个项目中你将必须建立那个带有 Id 的框,因为如果没有,它将创建 N 个框。
基于所有这些我认为在大多数逻辑中最好保留父实体,cob 级联类型保留在代表与女儿 class 的关系的 属性 中。
我在 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
}
我应该坚持感情的哪一方面?
- 是否取决于关系的拥有方?
- 是否取决于级联类型和拥有方没有共同点?
- 将
CascadeType.PERSIST
放入Box
实体,然后em.persist(box)
- 将
CascadeType.PERSIST
放入Item
实体,然后em.persist(item)
- 两者都有,
persist
由我决定 - 可以是em.persist(box)
或em.persist(item)
- 将
你可以坚持双方的关系。
如果持久化盒子实体,只需调用一次实体管理器的持久化方法并将盒子实体作为参数传递,使用项目实体列表,盒子项目参数必须有一个级联类型。
如果持久化item实体,则需要调用实体管理器的persist方法N次,即N个item,传递带有box参数的Item实体,box参数必须有级联类型。在第一个插入框不会有 ID,但是一旦你插入第一个项目,Box 就会有 ID,所以在接下来的 N-1 个项目中你将必须建立那个带有 Id 的框,因为如果没有,它将创建 N 个框。
基于所有这些我认为在大多数逻辑中最好保留父实体,cob 级联类型保留在代表与女儿 class 的关系的 属性 中。