使用JPA CRUD显式级联删除父级而不使用注释

时间:2017-07-26 15:17:43

标签: java spring hibernate spring-data-jpa

现在,如果我想从数据库中删除父条目,我会在Parent类中使用级联注释,因此删除Parent也会删除与之关联的所有子级。像这样:

@Entity
public class Parent implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
    private Set<Child> children;
}

@Entity
public class Child implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne
    @JoinColumn
    private Parent parent;  
}

实际的删除是这样的:

this.parentRepository.delete(parentID);

但是,如果我想明确选择是否级联删除或简单删除,我该怎么做?

我不认为我可以选择手动关闭代码中的级联注释,那么有没有一种方法可以在不使用注释的情况下级联删除?

1 个答案:

答案 0 :(得分:1)

如果孩子与父母有关系,则不应删除父母。这不是好方法。在db中,child不应该对父

notNull限制

但你真的想要控制级联删除,我建议使用@EntityListeners

@EntityListeners({ParentJpaCallbacksListener.class})
@Entity
public class Parent implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @OneToMany(mappedBy = "parent")
    private Set<Child> children;
}

,其中

@Component
public class ParentJpaCallbacksListener {
    @Autoware ChildRepository childRepository;

    @PreRemove
    // or @PostRemove
    void preRemove(Parent parent) {
        // your cascade deletion logic 
        // for example use childRepository to delete some children
    }

}

这样你就不应该cascade = CascadeType.REMOVE