Java 休眠:删除子对象

Java 休眠:删除子对象,java,hibernate,Java,Hibernate,我有以下POJO课程: @Entity @Table(name = "category") public final class Category extends AbstractData<Category> { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer categoryID; @Column(name = "categoryName") p

我有以下POJO课程:

@Entity
@Table(name = "category")
public final class Category extends AbstractData<Category>
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer categoryID;

    @Column(name = "categoryName")
    private String categoryName;

    @Column(name = "categoryDescription")
    private String categoryDescription;

    @ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name = "parentCategoryID", nullable = true)
    private Category parentCategory;

    @OneToMany(mappedBy = "parentCategory")
    private Set<Category> subCategories;

    @ManyToMany(cascade =
    { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "categories")
    private Set<Book> books;

    public Category()
    {
        this("", "", null);
    }

    public Category(String name, String description)
    {
        this(name, description, null);
    }

    public Category(String name, String description, Category parent)
    {
        this.categoryName = name;
        this.categoryDescription = description;
        this.parentCategory = parent;

        subCategories = new HashSet<Category>();
        books = new HashSet<Book>();
    }       

    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((categoryDescription == null) ? 0 : categoryDescription.hashCode());
        result = prime * result + ((categoryName == null) ? 0 : categoryName.hashCode());
        result = prime * result + ((parentCategory == null) ? 0 : parentCategory.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
        {
            return true;
        }

        if (obj == null)
        {
            return false;
        }

        if (getClass() != obj.getClass())
        {
            return false;
        }

        Category other = (Category) obj;

        if (categoryName == null)
        {
            if (other.categoryName != null) return false;
        }
        else if (!categoryName.equals(other.categoryName))
        {
            return false;
        }

        if (parentCategory == null)
        {
            if (other.parentCategory == null)
            {
                return true;
            }

            return false;
        }
        else
        {
            if (other.parentCategory != null)
            {
                return parentCategory.equals(other.parentCategory);
            }

            return false;
        }
    }
}
现在的问题是,在删除我的子对象时,我的父类别对象也会被删除

我哪里会错过要点


感谢是高级。

您已将类型“全部”的级联设置为与父级的关联。当然,对子对象的删除操作会级联到父对象:

@ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private Category parentCategory;

@ManyToOne
中去掉
级联


如果您想在删除父对象时删除子对象,请将
cascade=CascadeType.ALL
添加到
@OneToMany

谢谢。这就解决了问题。现在,如果我想在删除父对象时删除子对象,我该怎么办?您需要指定@OneToMany(orphanRemoving=true)
@ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private Category parentCategory;