我的数据库中有三个表;一个 Author 表,它有一个 id 列,一个 Publisher 表,它有一个 id 列,一个 Book 表,它有一个 id 列,一个 authorId 外键列,到 Author id,一个 publisherId 外键列,到发布者 ID。更新/删除选项的外键都设置为“NO ACTION”,但据我了解,Hibernate 应该能够自己处理这些。
作者实体有一组书籍,其中包含出版商 ID,但不知道作者。我已将其设置如下:
@Entity
@Table(name="author")
public class Author {
private Integer id;
private Set<Book> books;
@Id @GeneratedValue
public Integer getId() {
return id;
}
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) {
@JoinColumn(name="authorId")
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
}
@Entity
@Table(name="book") {
private Integer id;
private Integer publisherId;
@Id @GeneratedValue
public Integer getId() {
return id;
}
@ManyToOne(FetchType.EAGER)
@JoinColumn(name="publisherId")
public Integer getPublisherId() {
return publisherId;
}
public void setPublisherId(Integer publisherId) {
this.publisherId = publisherId;
}
}
我的问题是,当我尝试从作者的书籍中删除一本书时,Hibernate 尝试将 authorId 外键更新为 null,并且我收到 Book 表中的 authorId 列不能为 null 的错误。我想要发生的是完全删除该行。
我还尝试将 'orphanRemoval=true' 添加到 OneToMany 注释,并设置更新/删除到 Cascade,但我得到了同样的错误。
我可以使用哪些注释来指示当从作者的书集中删除一本书时,我希望删除 Book 表中的该行?这是否可能与我如何建立我的关系,如果没有,有什么更好的方法来解决这个问题?