当前位置: 首页 > 面试题库 >

Hibernate级联删除对象

禹昊穹
2023-03-14
问题内容

我对级联=“删除”的工作方式感到困惑。我在“城市”映射文件中以以下方式定义了映射:

<set inverse="true" name="client" cascade="delete">
  <key>
    <column name="id_name"/>
  </key>
    <one-to-many class="model.Client"/>
 </set>

类客户具有类城市的外键。

因此,当我运行时:

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

因此,当我运行(…)时,也应该删除所有客户端

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风格的操作


 类似资料:
  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它会在-预期行为中创建新的行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hib

  • 我试图通过联接表的一个外键级联删除联接表中的行,它有另一个与之相关的表,我也想删除与此ID相关的所有行。看起来像下图。当我使用会话时。使用hibernate删除(reqCandObject)它工作正常,并通过从候选jobReq表中删除一个条目以及相关注释进行级联。但是,我想删除所有具有特定候选ID的候选项(并删除注释)。我尝试了下面的函数,但与nice hibernate不同。删除(对象)函数,此

  • 使用Spring Boot 1.4.0和MySql 5.7 我有两个table并且它是单向的@manytomany,但是在角色的父端,我想删除权限hibernate会自动删除它自己和link-table记录: > 权限

  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

  • 我使用的是Hibernate的JPA实现。我有一个包含不同类型用户(私有、公共等)的用户表,user_type列指定用户的类型。 我有一个User类,它是一个表示User表的实体。我补充说 在我的用户类上创建了两个类,PrivateUser和PublicUser,它们都用相应的@DiscriminatorValue扩展了用户类。 如果我的解释不清楚,请让我知道。 提前致谢

  • 我正在从事一个java web项目,该项目使用: > Spring Hibernate/JPA MySQL-(在EasyPHP/PHPMyAdmin上)JDBC 当我想删除一些数据时,我遇到了一个错误。但是,只有当我想删除一个有子级的父行并且他的一个子行也至少有一个子行时,这个问题才存在。 目标:我希望操作/查询删除所选行及其子行和子行。 错误代码:在服务器输出中 28-Sep-2016 11:5