2016-05-01 6 views
0

こんにちはHibernate/JPAの達人! 私は休止状態を初めて知り、質問があります。双方向関係の非所有者の削除を自動化する方法はありますか?

だから

Tables: 
book (bookid, bookname) 
tag (tagid, tagname) 
booktaglink (booktaglinkid, bookid, tagid) 

public class Book() { 
    @ManyToMany(fetch = FetchType.LAZY) 
    @Cascade({CascadeType.MERGE, CascadeType.PERSIST, CascadeType.EVICT}) 
    @JoinTable(name = "booktaglink", 
      joinColumns = {@JoinColumn(name = "bookid") }, 
      inverseJoinColumns = {@JoinColumn(name = "tagid") }) 
    private List<Tag> tags = new ArrayList() 

} 

public class Tag() { 
    @ManyToMany(fetch = FetchType.LAZY, mappedBy="tags") 
    @Cascade({CascadeType.MERGE, CascadeType.PERSIST, CascadeType.EVICT}) 
    private List<Book> books = new ArrayList() 
} 

(どんな本が任意のタグでタグ付けすることができます)私はブックとタグの間で双方向の関係を持っていると言う、上記の...私はブックとタグ双方向の関係を持っているので、私はタグを取得することができます書籍に関連付けられた書籍、およびタグに関連付けられた書籍が含まれます。しかし、Booksはその関係を所有しています。

私はタグを削除します。これは正しいです?私は(この場合、Bookクラスに)関連の所有者を開いて、私は削除しようとしているタグを削除しなければならないのはなぜ

Tag tagToDelete; 
List<Book> books = tag.getBooks() 
for (Book book: books) { 
    book.getTags().remove(tagToDelete); 
    dataSource.save(book) 
} 
dataSource.delete(tagToDelete); 
  1. ?単純に削除をカスケードして、書籍との関連付けをすべて削除できますか?これは、私が単にdataSource.delete(tagToDelete)を実行すると、リンクテーブル内のすべての関連付けを残し、エラーを引き起こすので、これはうんざりです。上記の例のようにループ処理ではなく削除処理を自動化する方法はありますか?

  2. 誰が関係を持つべきかについての一般的な規則はありますか?

  3. 誰もが一方向の関係を作成するのはなぜですか?これが一方向で、タグを削除しようとしている場合、データベース内のすべての書籍をループして、削除しているタグを削除しない限り、関連付けを削除することはできません。非効率だと思われる。

ありがとうございます! PA

答えて

0

エンティティを双方向のManyToManyの関係で削除することは直感的ではありません。私が思い出したところでは、所有側(あなたの場合はBook)からエンティティを削除すると、Tagを削除せずにすべての結合も削除されます。これはうまくいきません。これを解決するには、両側を所有側として宣言してください。さらに、データの重複を防ぐためにSetを使用することをお勧めします。非常に良い答えだ

@JoinTable(name = "booktaglink", 
      joinColumns = {@JoinColumn(name = "tagid") }, 
      inverseJoinColumns = {@JoinColumn(name = "bookid") }) 
private Set<Book> books; 
+0

、あなたに感謝:あなたのクラスで

TagmappedBy="tags"を取り除くと@JoinTableを追加! – user6269972

+0

@ user6269972あなたの問題を解決した場合は、回答を受け入れたとマークすると、SOコミュニティと私にとって役立ちます。ハッピーコーディング=) –

+0

ありがとう、ありがとう! – user6269972

関連する問題