【问题标题】:using JPA CRUD to cascade delete parent explicitly without using annotation使用 JPA CRUD 显式级联删除父级而不使用注释
【发布时间】:2018-01-02 00:31:55
【问题描述】:

现在,如果我想从数据库中删除 Parent 条目,我会在 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);

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

我觉得不能手动选择关闭代码中的级联注解,那么有没有不使用注解级联删除的方法呢?

【问题讨论】:

标签: java spring hibernate spring-data-jpa


【解决方案1】:

如果孩子与父母有关系,则不应删除父母。这不是好办法。在 db 中,子级不应有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多