你好Hibernate / JPA大师! 我是Hibernate的新手,有一个问题。
假设我在图书和标签之间有双向关系(任何图书都可以用任何标签标记)
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()
}
所以,上面......我有书籍和标签双向关系,所以我可以检索与书籍相关的标签,以及与标签相关联的书籍。然而,图书拥有这种关系。
说我要删除标签。这是对的吗?
Tag tagToDelete;
List<Book> books = tag.getBooks()
for (Book book: books) {
book.getTags().remove(tagToDelete);
dataSource.save(book)
}
dataSource.delete(tagToDelete);
为什么我必须打开关联所有者(在本例中为Book类)并删除我要删除的标记?我可以简单地级联删除并删除与书籍的所有关联吗?这很糟糕,因为如果我只是执行dataSource.delete(tagToDelete),它将在链接表中保留所有关联,并导致错误。是否有任何方法可以自动执行删除过程,而不是像上面的示例中那样循环。
是否有关于谁应该拥有这种关系的一般规则?
为什么有人会建立单向关系?如果这是单向的,并且我试图删除标记,我将永远无法删除关联,除非我遍历数据库中的所有书籍并删除我正在删除的标记。似乎效率低下。
非常感谢!! PA
答案 0 :(得分:0)
删除双向ManyToMany
关系中的实体并不直观。根据我的记忆,当您从拥有方删除实体(在您的情况下为Book
)时,所有连接也会被删除,而不会删除任何Tag
。反之亦然,这不会起作用。要解决这个问题,只需将双方都称为拥有方。另外,我建议您使用Set
来防止重复数据。
在您的班级Tag
中删除mappedBy="tags"
并添加@JoinTable
:
@JoinTable(name = "booktaglink",
joinColumns = {@JoinColumn(name = "tagid") },
inverseJoinColumns = {@JoinColumn(name = "bookid") })
private Set<Book> books;