我对cascade =“ delete”的工作方式有些困惑(…)
级联
delete操作意味着,如果您
delete是父母,则该操作将沿关联传播。因此,在您的情况下,删除
City实体应传播到
Client。
因此,当我运行(…)时,也应该删除所有客户端
该
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子句中使用子选择)。
- 一个 批量删除不级联 (而不会照顾连接的表)。
因此,使用批量删除功能,您必须删除
Client之前的
City。但是性能要好得多。
PS:您需要
commit()在某个时候进行(并改善错误处理,即
rollback()在catch块中)
参考文献
- Hibernate Core参考指南
- 14.4。DML风格的操作



