こんにちは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);
?単純に削除をカスケードして、書籍との関連付けをすべて削除できますか?これは、私が単にdataSource.delete(tagToDelete)を実行すると、リンクテーブル内のすべての関連付けを残し、エラーを引き起こすので、これはうんざりです。上記の例のようにループ処理ではなく削除処理を自動化する方法はありますか?
誰が関係を持つべきかについての一般的な規則はありますか?
誰もが一方向の関係を作成するのはなぜですか?これが一方向で、タグを削除しようとしている場合、データベース内のすべての書籍をループして、削除しているタグを削除しない限り、関連付けを削除することはできません。非効率だと思われる。
ありがとうございます! PA
、あなたに感謝:あなたのクラスで
Tag
mappedBy="tags"
を取り除くと@JoinTable
を追加! – user6269972@ user6269972あなたの問題を解決した場合は、回答を受け入れたとマークすると、SOコミュニティと私にとって役立ちます。ハッピーコーディング=) –
ありがとう、ありがとう! – user6269972