动机
这并没有为我工作,我设置
<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