1

我的数据库中有三个表;一个 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 表中的该行?这是否可能与我如何建立我的关系,如果没有,有什么更好的方法来解决这个问题?

4

1 回答 1

1

数据库中的 AuthorId 列是否设置为 NOT NULL?可能是 Hibernate 将在两遍中删除该行。第一遍使外键引用为空,第二遍然后删除该行。我正在使用 NHibernate 并且肯定看到过类似的行为。如果是这种情况,那么您应该能够通过将 AuthorId 设置为 NULLable 来解决您的问题。

于 2012-11-02T09:29:07.877 回答