当前位置: 首页 > 知识库问答 >
问题:

Hibernate实体级联删除父级或子级

齐元章
2023-03-14

我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.*;

import javax.persistence.*;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

@Getter
@Setter
@EqualsAndHashCode(exclude = {"recipes","categories","parentCategory","childrenCategory"})
@Entity
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String categoryName;

    private String categoryDescription;

    private String categoryUrl;


    @OneToMany(mappedBy = "parentCategory",cascade = CascadeType.ALL)
    private Set<Category> childrenCategory = new HashSet<>();

    @ManyToOne
    private Category parentCategory;

    private boolean menuActive;

    @ManyToMany(mappedBy = "categories")
    Set<Recipe> recipes = new HashSet<>();

    public Category addChildren(Category category){
        this.getChildrenCategory().add(category);
        category.setParentCategory(this);
        return this;
    }

}

我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。

错误消息;

Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束["FKBPI63NYEL12J6UG0D7S6BUAKX: PUBLIC.CAT_RECIPEFOREIGN KEY(CATEGORY_ID)REFERENCES PUBLIC. CATEGORY(ID)(5)";SQL语句:从id=?[23503-197]]的类别中删除;嵌套异常org.hibernate.exception.ConstraintViolationException:无法执行语句]

如何删除父类别?

解决方案

public void removeChildren(Category childCategory){
    childCategory.setParentCategory(null);
}

你可以打电话

category.get(). getChildren类别(). foreach(category.get()::远程儿童);

共有1个答案

阎烨
2023-03-14

这是一种双向关系。所以你需要消除双方的联系。类似这样:

public void removeChildren(Category childCategory){
    this.getChildrenCategory().remove(childCategory);
    childCategory.setParentCategory(null);
}

然后

parentCategory.getSubCategories().forEach(parentCategory::remove)

现在您可以删除父母类别

 类似资料:
  • 我有一个非常简单的Spring靴测试 我要从父实体中删除子实体。链接使用的是单向,拥有实体是父实体。我试着给1打电话。,但hibernate最终生成了一个update语句,将parent_name设置为null(而不是delete where parent_name=“father”),这违反了子表中的不可为null约束。 然后我试着打电话给2。,这一次它给出了一个异常。 你如何修复上面的,以使儿

  • 我正在从事一个java web项目,该项目使用: > Spring Hibernate/JPA MySQL-(在EasyPHP/PHPMyAdmin上)JDBC 当我想删除一些数据时,我遇到了一个错误。但是,只有当我想删除一个有子级的父行并且他的一个子行也至少有一个子行时,这个问题才存在。 目标:我希望操作/查询删除所选行及其子行和子行。 错误代码:在服务器输出中 28-Sep-2016 11:5

  • 我使用此实体表示具有自关系的类别系统,以获取子类别: 问题是当我想删除一个有子类别的类别时。我想删除所有子类别,但Java会删除此异常: 无法删除或更新父行:外键约束失败(,约束外键()引用) 我试图改变一些东西,如孤儿移除=真或级联=CascadeType。删除或尝试将级联放在单独的注释中,但不起作用。 我最后的希望是手动递归删除类别child,但这不是正确的方法。 提前感谢:)

  • 代码: 三个问题: > 我必须放置<code>CascadeType吗。在两个实体中删除?我希望它能正常工作,这样如果我删除了老师,课程就会自动删除。 在我的数据库中,我的id无法正常工作。我希望它使id每次增加一个,但它目前增加了一些随机数。为什么呢? 我还有两个类,但有关系。当我想在数据库中持久化一个新对象时,我必须做什么?

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 我有两个实体使用Spring和Hibernate