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

标签 java spring hibernate spring-data-jpa

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

相关文章:

java - Hibernate 4 Spring 4 无法获取当前线程的事务同步 session

java - war 的 lib 和 Ear 的 lib 之间的 Wildfly 类加载器问题

java - 未调用 Spring Java 配置

java - 基本 Java 继承练习

java - 了解AppKey安全性(无 secret )

java - 伊巴蒂斯 : Is there a way of adding a rowhandler in an Ibatis resultmap subselect within the sqlmap xml?

java - 错误 : stack depth limit exceeded - Java hibernate postgresql

java - 传递保存

java - 如何获取 TYPE_3BYTE_BGR 中 jpeg 图像的 rgb 值?

java - 找不到符号textView AndroidStudio