Mysql 如何让Hibernate通过实体it';什么是外国重点?

Mysql 如何让Hibernate通过实体it';什么是外国重点?,mysql,hibernate,jpa,foreign-keys,many-to-one,Mysql,Hibernate,Jpa,Foreign Keys,Many To One,我的数据库中有三个表;Author表(具有id列)、Publisher表(具有id列)和Book表(具有id列)、authord外键列(对于Author id)和publisherId外键列(对于Publisher id)。更新/删除外键选项都设置为“无操作”,但据我所知,Hibernate应该能够自己处理这些问题 作者实体有一组书籍,其中包含出版商Id,但不知道作者。我已将其设置为以下内容: @Entity @Table(name="author") public class Author {

我的数据库中有三个表;Author表(具有id列)、Publisher表(具有id列)和Book表(具有id列)、authord外键列(对于Author id)和publisherId外键列(对于Publisher 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;
    }
}
@实体
@表(name=“author”)
公共类作者{
私有整数id;
私人书籍;
@Id@GeneratedValue
公共整数getId(){
返回id;
}
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL){
@JoinColumn(name=“authord”)
公共集getBooks(){
还书;
}
公共书籍(套书){
这本书=书;
}
}
@实体
@表(name=“book”){
私有整数id;
私有整数;
@Id@GeneratedValue
公共整数getId(){
返回id;
}
@manytone(FetchType.EAGER)
@JoinColumn(name=“publisherId”)
公共整数getPublisherId(){
返回或删除;
}
public void setPublisherId(整数publisherId){
this.publisherId=publisherId;
}
}
我的问题是,当我试图从作者的书集中删除一本书时,Hibernate试图将authorId外键更新为null,并且我得到一个错误,即Book表中的authorId列不能为null。我想要的是完全删除该行

我还尝试将“orphanRemoving=true”添加到OneToMany注释中,并将更新/删除设置为级联,但我得到了相同的错误


我可以使用哪些注释来表示当一本书从作者的书集中删除时,我希望删除书表中的那一行?这是否可能与我如何设置关系有关?如果不可能,还有什么更好的方法来实现这一点?

数据库中的AuthorId列是否设置为非空?可能是这样的bernate将分两次删除该行。第一次删除外键引用,第二次删除该行。我使用的是NHibernate,当然也看到过类似的行为。如果是这种情况,那么您应该能够通过将AuthorId设置为可空来解决问题。

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

没错!我以为Hibernate只会删除行,但我没有想到,设置null然后删除行可能需要更长的时间。这似乎有点奇怪,因为理想情况下,我希望通过将authorId设置为非null来确保没有作者的书,但我想我必须确保我的其余代码有完整性来实现这一点。感谢您的快速回答!请注意!我以为Hibernate只会删除行,但我没有想到,通过设置null然后删除行可能需要更长的时间。这似乎有点奇怪,因为理想情况下,我希望通过将authorId设置为非null来确保没有作者的书籍,但是我想我必须确保我的代码的其余部分具有完整性才能实现这一点。谢谢你的快速回答!