对于父实体和子实体之间的简单@OneToMany映射,我遇到了一个问题。所有的工作都很好,只是当我从集合中删除子记录时,它们不会被删除。
父级:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}孩子:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}如果我现在从childs集合中删除and child,它不会从数据库中删除。我尝试将child.parent引用设为空,但也不起作用。
实体在web应用程序中使用,删除操作作为Ajax请求的一部分发生。当按下保存按钮时,我没有删除的孩子的列表,所以我不能隐式删除它们。
发布于 2010-01-06 15:46:31
JPA的行为是正确的(根据规范):对象不会因为您从OneToMany集合中删除它们而被删除。有特定于供应商的扩展可以做到这一点,但本机JPA不能满足这一要求。
在某种程度上,这是因为JPA实际上并不知道它是否应该从集合中删除某些内容。在对象建模术语中,这就是组合和“聚合”之间的区别。
在组合中,子实体没有父实体就不存在。一个典型的例子是在House和Room之间。删除房子和房间也去。
聚合是一种较松散的关联,以课程和学生为代表。删除该课程后,该学员仍然存在(可能在其他课程中)。
因此,您需要使用特定于供应商的扩展来强制执行此行为(如果可用),或者显式地删除子对象并将其从父对象的集合中移除。
我知道:
发布于 2010-01-06 17:49:55
除了cletus的答案之外,JPA 2.0自2010年12月以来的最终版本,在@OneToMany注释上引入了orphanRemoval属性。有关更多详细信息,请参阅此blog entry。
请注意,由于该规范相对较新,并不是所有的JPA1提供者都有最终的JPA2实现。例如,Hibernate 3.5.0-Beta-2 release尚不支持此属性。
发布于 2013-04-04 07:39:31
您可以尝试这样做:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)。
https://stackoverflow.com/questions/2011519
复制相似问题