我有一个简单的问题 @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;

  ...
}

如果我现在从子集合中删除子集合,它不会从数据库中删除。我尝试取消 child.parent 参考,但这也不起作用。

这些实体在 Web 应用程序中使用,删除作为 Ajax 请求的一部分发生。当按下保存按钮时,我没有已删除子项的列表,因此我无法隐式删除它们。

有帮助吗?

解决方案

JPA 的行为是正确的(意味着 根据规格):对象不会仅仅因为您从 OneToMany 集合中删除它们而被删除。有特定于供应商的扩展可以做到这一点,但本机 JPA 无法满足这一需求。

部分原因是 JPA 实际上并不知道是否应该删除从集合中删除的内容。在对象建模术语中,这是之间的区别 作品 和“聚合*。

作品, ,没有父实体,子实体就不存在。一个典型的例子是 House 和 Room 之间。删除房子和房间。

聚合 是一种较松散的关联,以“课程”和“学生”为代表。删除课程,学生仍然存在(可能在其他课程中)。

因此,您需要使用特定于供应商的扩展来强制执行此行为(如果可用)或显式删除子级并将其从父级集合中删除。

我知道:

其他提示

在除了克莱图斯的回答, JPA 2.0 时,最终自2010年12月,介绍了orphanRemoval注解的属性@OneToMany。 欲了解更多详情,请参阅此博客条目

请注意,由于规范是相对较新的,不是所有的JPA 1提供商有一个最后的JPA 2实现。例如,休眠3.5.0-β-2释放尚不支持此特性。

您可以试试这个:

@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)

如前所述,这是不可能的事我想和JPA,所以我采用的hibernate.cascade注释,这一点,在父类中的相关代码现在看起来是这样的:

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "parent")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
            org.hibernate.annotations.CascadeType.DELETE,
            org.hibernate.annotations.CascadeType.MERGE,
            org.hibernate.annotations.CascadeType.PERSIST,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<Child> childs = new HashSet<Child>();

我不能简单的用“ALL”,因为这会删除父也。

下面级联,在删除的情况下,意味着,如果删除父子被除去。没有关联。如果你正在使用Hibernate作为JPA提供者,则可以使用的冬眠特定级联

您可以试试这个:

@OneToOne(cascade = CascadeType.REFRESH) 

@OneToMany(cascade = CascadeType.REFRESH)
@Entity 
class Employee {
     @OneToOne(orphanRemoval=true)
     private Address address;
}

请参阅 href="https://stackoverflow.com/questions/18813341/what-is-the-difference-between-cascade-and-orphan-removal-from-db">。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top