データベースに 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 テーブルのその行を削除したいことを示すために、どの注釈を使用できますか? これは、私が自分の関係をどのように設定しているかでまったく可能ですか?そうでない場合、これにアプローチするより良い方法は何ですか?