1

データベースに 3 つのテーブルがあります。id 列を持つ Author テーブル、id 列を持つ Publisher テーブル、id 列を持つ Book テーブル、authorId 外部キー列、Author id、および publisherId 外部キー列、toパブリッシャー ID。更新/削除オプションの外部キーはすべて「アクションなし」に設定されていますが、私が理解していることから、Hibernate はこれら自体を処理できるはずです。

Author エンティティには一連の Books があります。これには出版社 ID が含まれていますが、Author についてはわかりません。これを次のように設定しました。

@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 に更新しようとし、列 authorId を Book テーブルで null にすることはできないというエラーが表示されることです。私がしたいのは、その行を完全に削除することです。

OneToMany アノテーションに 'orphanRemoval=true' を追加し、カスケードへの更新/削除を設定しようとしましたが、同じエラーが発生します。

著者の書籍セットから本が削除されたときに、Book テーブルのその行を削除したいことを示すために、どの注釈を使用できますか? これは、私が自分の関係をどのように設定しているかでまったく可能ですか?そうでない場合、これにアプローチするより良い方法は何ですか?

4

1 に答える 1

1

データベースで AuthorId 列が NOT NULL に設定されていますか? Hibernate が 2 つのパスで行を削除しようとしている可能性があります。最初のパスで外部キー参照が null になり、2 番目のパスで行が削除されます。私はNHibernateを使用していますが、確かに同様の動作を見てきました。この場合、AuthorId を NULLable に設定することで問題を解決できるはずです。

于 2012-11-02T09:29:07.877 に答える