【问题标题】:How can I tell Hibernate to delete a table row through the entity it's foreign key points to?如何告诉 Hibernate 通过其外键指向的实体删除表行?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 看准了!我曾假设 Hibernate 会简单地删除这些行,但我没有想到通过设置 null 并 then 删除它们可能需要更长的路线。这似乎有点奇怪,因为理想情况下,我想通过将 authorId 设置为不为空来确保我没有任何没有作者的书,但我想我必须确保我的其余代码具有实现这一点的完整性。感谢您的快速回答!
    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2017-03-14
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多