gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:27:22 26 4
gpt4 key购买 nike

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

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

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

最佳答案

如果子项与父项有关系,则不应删除父项。这不是什么好办法。在数据库中, child 不应该对 parent 有 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

关于java - 使用 JPA CRUD 显式级联删除父级而不使用注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com