关于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的特性的话,那为什么要这么做呢?

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

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

配置没有问题,hibernate确实会生成N多语句。

[code="sql"]
delete from article where board_id = ?
delete from comment where article_id = ?
[/code]
像这样一次删除过多(>1W),不光慢, db redo area 极可能溢出错误.
用Hibernate的方式,虽慢,如果分开提交,至少不出错

在Hibernate纯粹的ORM角度看来,删除的是Object,而不是关心样的什么数据哪里的数据。这样一来就很好理解了
[code="java"]
session.delete(obj);
[/code]