動機
これは私にはうまくいきませんでした、私は設定しました
<property name="show_sql">true</property>
出力には のようなものは何も表示されませんでした...ON DELETE CASCADE...
。
私のために働いた別の解決策を見つけました:
著者用のクラスと著者の本用のクラスがあり、(休止状態、SQL クエリなどを介して) 著者を削除するたびにすべての本を自動削除したいとしますが、(常に) 削除できない理由があるとします。 session.delete()。
多分:
session.createSQLQuery("DELETE FROM author").executeUpdate();
解決
したがって、作成者クラスは次のようになります。
@Entity
@Table(name = "author")
public class Author {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "ID")
private Integer id;
@Column(name = "NAME")
private String name;
@OneToMany(mappedBy = "author")
private Set<Book> books;
...
クラスブックは次のようになります。
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "ID")
private Integer id;
@Column(name = "TITLE")
private String title;
@ManyToOne
@JoinColumn(name = "AUTHOR_ID", foreignKey = @ForeignKey(name = "FK_BOOK_author_AUTHOR_ID"))
private Author author;
...
トリックは、を使用して自分で外部キー制約に名前を付けることです
foreignKey = @ForeignKey(name = "FK_BOOK_author_AUTHOR_ID")
そして追加
<property name="hibernate.hbm2ddl.import_files">update.sql</property>
hibernate.cfg.xmlに追加します( hibernate.hbm2ddl.autoを忘れないでください)。update.sqlには、テーブル制約の更新が含まれます。
ALTER TABLE `book` DROP FOREIGN KEY `FK_BOOK_author_AUTHOR_ID`;
ALTER TABLE `book` ADD CONSTRAINT `FK_BOOK_author_AUTHOR_ID` FOREIGN KEY (`AUTHOR_ID`) REFERENCES `author`(`ID`) ON DELETE CASCADE;
そのため、hibernate は制約の名前を認識しているため、常に制約をドロップ/変更できます。@Cascade 設定も確認する必要があります。また、セッションでオブジェクトの削除を処理する方法について戦略を実装する必要があります。