2016-05-07 86 views
3

我试图创建一个真正真正的虚拟字典后端使用休眠和j2ee。 (只是为了学习这些技术。)休眠多对多正确删除

我有两个实体'Word'和'Category',并且它们之间存在多对多的关系。我想要达到的是,如果我删除了一个类别,它将从所有受影响的单词的类别中删除,但这些单词仍然存在,如果我删除了一个单词,那么从类别的角度来看,什么都不会发生。即使在该类别应该存在的类别中再没有字词。

目前我无法删除一个类别,如果该类别中至少有一个单词。 (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类中创建集,因为会有很多字的那一套,可能导致性能问题。 如果可能的话,我不会在Category类中创建一个Set。

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

在此先感谢。

+0

我认为你需要一个连接表,如果这些实体之间的关系是可选的(字无类;没有的话类别, ...)下面是一个如何实现这种情况的例子https://howtoprogramwithjava.com/hibernate-manytomany-unidirectional-bidirectional/ – RubioRic

+0

我也指@JoinTable注解。 – RubioRic

回答

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); 
     } 
+0

它的工作原理,但我认为冬眠可以自动处理这个问题。在我看来,它真的很丑,我不得不手动删除它。 – laci0725