我的数据库中有三个表;具有ID列的作者表,具有ID列的发布者表和一个书籍表,该表具有ID列,一个作者ID的权威外键列,以及一个PublisherId forublis forough efirn键列发布者ID。更新/删除选项上的外键都设置为"无动作",但是据我了解,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试图将权威的外键更新为null,并且我会发现列的权威在书籍表中不能为null。我想发生的事情是要完全删除该行。
我还尝试将'orphanremoval = true'添加到OneTomany注释中,并在delete上设置为dellete to Cascade,但我遇到了相同的错误。
我可以使用哪些注释来指出,当一本书从作者的书籍中删除一本书时,我希望删除书籍表中的一行?我如何建立关系,如果没有,这是一个更好的方法?
在数据库中是否设置为"不为空"?冬眠可能会在两次传球中删除行。第一段通过将外键参考为null,第二次通过删除行。我正在使用NHIBERNATE,并且肯定已经看到了类似的行为。如果是这种情况,那么您应该能够通过将权威性设置为无效来解决问题。