我对cascade =“delete”的工作原理有点困惑。我在城市映射文件中按以下方式定义了映射:
<set inverse="true" name="client" cascade="delete">
<key>
<column name="id_name"/>
</key>
<one-to-many class="model.Client"/>
</set>
Client 类有 City 类的外键。
所以当我跑步时:
List object = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
try {
session.delete("from City where row_id=" + row_id and table_id = " + table_id);
} catch (Exception e) {
e.printStackTrace();
}
}
所有客户端都应该被删除还是我必须以某种方式处理它?我是否将查询作为方法参数正确传递给会话的 delete() 方法?谢谢你的帮助。
此致,
粗鲁。
我对cascade =“delete”的工作原理有点困惑(...)
级联一个delete
操作意味着如果您delete
父级,操作将沿着关联传播。所以在你的情况下,删除City
实体应该传播到Client
s.
因此,当我运行 (...) 时,所有客户端也应该被删除吗
The Session#delete(String)
方法需要一个HQL 查询字符串,执行它,迭代结果并调用Session#delete(Object)
每个对象都遵循级联(因此,如果您的查询确实是 HQL 查询,则客户端将被删除)。
但这种方法很旧,在 Hibernate 3 中已被弃用(并移至“经典”Session
接口),我不太推荐它(它执行 1+N 操作,并且删除大量结果的效率相当低)。
如果这是一个问题,最好选择批量删除Hibernate 提供的支持:
int deleteCount = session.createQuery("delete from Foo where bar = :bar")
.setParameter("bar", bar);
.executeUpdate()
但请注意,批量删除有限制:
- 您不能使用别名。
- 查询中没有内部联接(尽管您可以在 where 子句中使用子选择)。
- A 批量删除不级联(并且不会处理连接表)。
因此,通过批量删除,您必须删除Client
之前City
。但表演要好得多。
PS:你需要commit()
在某些时候(并且还可以改进您的错误处理,即rollback()
在 catch 块中)
参考
- Hibernate Core Reference Guide
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)