gpt4 book ai didi

mysql - 我如何告诉 Hibernate 通过外键指向的实体删除表行?

转载 作者:行者123 更新时间:2023-11-29 00:38:49 25 4
gpt4 key购买 nike

我的数据库中有三个表;一个 Author 表,它有一个 id 列,一个 Publisher 表,它有一个 id 列,一个 Book 表,它有一个 id 列,一个 authorId 外键列,到 Author id,和一个 publisherId 外键列,到发布商 ID。更新/删除选项的外键都设置为“NO ACTION”,但据我了解,Hibernate 应该能够自行处理这些问题。

Author 实体有一组 Books,其中包含出版商 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 注释,并将更新/删除设置为级联,但我得到了同样的错误。

我可以使用哪些注释来指示当一本书从作者的书中删除时,我希望删除 Book 表中的该行?这是否可能与我建立人际关系的方式有关?如果不可能,有什么更好的方法来解决这个问题?

最佳答案

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

关于mysql - 我如何告诉 Hibernate 通过外键指向的实体删除表行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13192325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com