【发布时间】:2012-10-22 22:34:25
【问题描述】:
我的数据库中有三个表;一个 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 表中的该行?我如何建立我的关系是否有可能?如果没有,有什么更好的方法来解决这个问题?
【问题讨论】:
标签: mysql hibernate jpa foreign-keys many-to-one