楼上的,我没有否认Hibernate是一个不错的ORM产品,但任何ORM产品都逃不过这些问题, 正因为 Hibernate 是基于OO的,所以任何数据库的修改与删除, 实际上都是基于对象的操作,所以它都要先从数据库中选出来存入对象。 理论上讲这样降低了执行效率是勿庸置疑的。 一般情况下这个动作很快,感觉不到而已。 但对于大数据量的操作,这样做是不是很好?值得讨论。 现在我有一个表Person和author, 一对一,author的ID取自person的ID 现在我要删除所有person中name='Person2'的记录, hibernate是这样处理的:select person0_.id as id, person0_.name as name, person0_.email as email from person person0_ where (person0_.name=? ) select author0_.id as id0_, author0_.alias as alias0_ from author author0_ where author0_.id=? select author0_.id as id0_, author0_.alias as alias0_ from author author0_ where author0_.id=? delete from person where id=?可以很清楚的看出它的过程,它先选出来,然后按主键ID来删除。 如果直接使用JDBC则一句SQL delete from person where name='Person2'即可。 你举的例子确实是批处理,不过那其实是jdbc中的batch操作的意思。 并不是我说的这个批处理的意思。这也是楼主所提的问题所在。
如果你直接给出主键就少一次查询了。
楼上的说得对;在hibernate中是没有批量删除的;它都是用HSQL先把数据取出来;然后利用:session.delete("from Cat as c");
来删除的;我建议你还是看看hibernate的帮助文档,我都看了几篇,没次看感觉都不一样,很有收获的哟;
可以这样<key ... on-delete="cascade"/>,
使用数据库外键约束来删除
虽然OO很好,但也有很多缺陷。我认为它的缓存机制有时反而降低效率。
http://blog.hibernate.org/cgi-bin/blosxom.cgi>虽然OO很好,但也有很多缺陷<
举几个例子好了>我认为它的缓存机制有时反而降低效率<
同样也举个例子好了
正因为 Hibernate 是基于OO的,所以任何数据库的修改与删除,
实际上都是基于对象的操作,所以它都要先从数据库中选出来存入对象。
理论上讲这样降低了执行效率是勿庸置疑的。
一般情况下这个动作很快,感觉不到而已。
但对于大数据量的操作,这样做是不是很好?值得讨论。
现在我有一个表Person和author, 一对一,author的ID取自person的ID
现在我要删除所有person中name='Person2'的记录,
hibernate是这样处理的:select person0_.id as id, person0_.name as name, person0_.email as email from person person0_ where (person0_.name=? )
select author0_.id as id0_, author0_.alias as alias0_ from author author0_ where author0_.id=?
select author0_.id as id0_, author0_.alias as alias0_ from author author0_ where author0_.id=?
delete from person where id=?可以很清楚的看出它的过程,它先选出来,然后按主键ID来删除。
如果直接使用JDBC则一句SQL delete from person where name='Person2'即可。
你举的例子确实是批处理,不过那其实是jdbc中的batch操作的意思。
并不是我说的这个批处理的意思。这也是楼主所提的问题所在。
你上面这个例子,一个Person总是要先查询出来,展示给用户,然后用户再提交
删除命令,所以只要把二级缓存打开,这个Person对象也不会被查询两次的。现在hibernate的问题是需要删除一大批纪录的情况,它暂时还没法高效地处理,
那就直接用jdbc好了,这应该很简单吧,hibernate3应该会实现高效批删除。