Hibernate很多都适当删除

时间:2016-05-07 18:29:59

标签: java hibernate many-to-many

我试图使用hibernate和j2ee创建一个非常真实的虚拟字典后端。 (只是为了学习这些技术。)

我有两个实体' Word'和'类别'并且这些之间存在多种关系。我想要达到的是,如果我删除一个类别,那么它将被删除所有受影响的单词'类别,但单词仍然存在,如果我删除一个单词,那么从类别的角度来看没有任何反应。即使在该类别中没有更多的词语,该类别也应该存在。

目前,如果该类别中至少有一个单词,我无法删除该类别。 (Recive:org.hibernate.exception.ConstraintViolationException:无法执行语句) 如果我删除了一个单词,如果该类别中没有更多的单词,那么该类别也会被删除。

以下是我如何宣布实体:

@Entity
@Table(name = "Word")
public class Word {
    @Id()
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String uid;

    @NotNull
    @Column(nullable = false, length = 512)
    private String hungarian;

    @NotNull
    @Column(nullable = false, length = 512)
    private String english;

    @JoinColumn(name = "categories_uid")
    @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
    @Valid
    private Set<Category> categories;
...
}

@Entity
@Table(name = "Category")
public class Category {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String uid;

    @NotNull
    @Size(min = 3, max = 512)
    @Column(nullable = false, length = 512)
    private String name;
...
}

我没有在Category类中创建Set,因为该集合中会有很多单词可能导致性能问题。 如果可能的话,我不会在Category类中创建一个Set。

我认为CascadeType.ALL应该处理这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

由于外键约束,您的删除操作失败。 在这种情况下,您可以在多对多关系中定义一个所有者方,即Word,然后当您删除Word时,将自动处理该关系。但是如果要删除类别,则必须手动将其删除:

      @Entity
      public class Word {
      @ManyToMany
      Set<Category> categories;

      @Entity
      public class Category {
      @ManyToMany(mappedBy="categories")
      Set<Word> words;

       // call you entity manager to remove a category
       em.remove(category);
       for (Word word : category.words) {
            word.categories.remove(category);
       }