有没有什么方法可以自动删除双向关系的非所有者?

时间:2016-05-01 19:26:26

标签: java hibernate jpa

你好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);
  1. 为什么我必须打开关联所有者(在本例中为Book类)并删除我要删除的标记?我可以简单地级联删除并删除与书籍的所有关联吗?这很糟糕,因为如果我只是执行dataSource.delete(tagToDelete),它将在链接表中保留所有关联,并导致错误。是否有任何方法可以自动执行删除过程,而不是像上面的示例中那样循环。

  2. 是否有关于谁应该拥有这种关系的一般规则?

  3. 为什么有人会建立单向关系?如果这是单向的,并且我试图删除标记,我将永远无法删除关联,除非我遍历数据库中的所有书籍并删除我正在删除的标记。似乎效率低下。

  4. 非常感谢!! PA

1 个答案:

答案 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;