2016-05-07 12 views
3

私はhibernateとj2eeを使って実際にダミーの辞書バックエンドを作成しようとしています。 (これらの技術を学ぶために)Hibernate many to many proper delete

私は2つのエンティティ 'Word'と 'Category'を持っており、これらの間には多くの関係があります。私が到達したいのは、カテゴリを削除すると、影響を受ける単語のカテゴリすべてから削除されていますが、単語がまだ存在していて、単語を削除すると、カテゴリの観点からは何も起こりません。そのカテゴリにはそれ以上の単語がなくてもカテゴリが存在するはずです。

現在カテゴリを削除することはできません。そのカテゴリには少なくとも1つの単語があります。 (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