coolhwm 2011-12-01 17:17
浏览 196
已采纳

关于hibernate级联删除,需要多条sql语句的问题

数据库模式:

Board(board_id)
Article(article_id,board_id)
Comment(comment_id, article_id)

 

设置级联删除,也就是删除Board时,会自动级联删除和Board关联的所有Article,以及和所有被删Article关联的所有Comment。

 

配置映射文件后,效果达到了,全部都级联删除了,但是生成的SQL语句非常怪异。

按预想来说,每部分的级联删除应该使用外键直接删除,如:

delete from article where board_id = ?
delete from comment where article_id = ?

 

可是hibernate却使用主键删除,从而产生了非常多得sql语句,如:

delete from comment where comment_id = ?
...
...
...
delete from article where article_id = ?
delete from comment where comment_id = ?
...
...
...
delete from article where article_id = ?
............
delete from board where board_id = ?

 
是配置的问题吗?还是hibernate就是这样操作的呢?、

如果是这样的话,删除关联众多的对象的话不是需要非常多得SQL语句,不是很影响性能么?

如何才能简化hibernate产生的sql语句呢?最好是通过配置hibernate实现。

如果这就是Hibernate的特性的话,那为什么要这么做呢?

  • 写回答

2条回答 默认 最新

  • lanmoshui1020 2011-12-06 12:57
    关注

    删除Board前,先遍历所有涉及到的Article,遍历删除Article时,发现每一个Article又有很多Comment要先删掉,于是再删对应的Comment。

    产生的这么多Delete语句不会立即执行,而是在事务提交时进行flush操作时对有所delete语句批处理 preparedStatement.executeBatch(),与数据库通信次数很有限,所以性能方面不用担心。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示