動機
這並沒有爲我工作,我設置
<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(不要忘記休眠。 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設置 - 而且您必須實施一項策略,以確定如何處理會話中對象的刪除操作!
在水果POJO我必須創建一個字段'葡萄'像'私人設置葡萄;'沒有註釋?孩子對父母也一樣嗎? –
user1467855
2012-07-18 18:00:49
是的。以上是對獲得者的註釋;你仍然需要這些字段 – atrain 2012-07-18 18:09:34
在回來之前,我試圖自己做很多事情,只是爲了看看是否有可能有效的帖子版本。但它沒有奏效。首先它抱怨'無法確定類型爲:java.util.Set,在表:Fruit,列(葡萄)';那麼當我在'Set葡萄'字段中添加'@ ManyToOne'時,它會說缺少表格Fruit_Grape。仍然感謝張貼。 –
user1467855
2012-07-19 20:29:07