ddf168913 2009-10-10 16:32 采纳率: 100%
浏览 356
已采纳

Hibernate批量删除问题

我使用这样的hql语句删除
[code="java"]
delete from User where id in(16.18)
[/code]

他发出的sql语句是:
[code="java"]
delete from t_user where id in (16 , 18)
[/code]

并没有发出查询16 18两个User对象,然后再删除这两个user对象

为什么说Hibernate批量删除效率低呢?那位解释解释
[b]问题补充:[/b]
[quote]
这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
Java代码
session.flush();

[/quote]

session.flush(); 是将缓存数据与数据库数据同步

[quote]
这个操作带来的开销并不一定比查询出来再删除带来的开销要小的。

所以通常的删除方式是将要删除的对象找出来再进行删除。

[/quote]

“将要删除的对象找出来再进行删除。”
将事务提交时,hibernate也会执行session.flush啊

[b]问题补充:[/b]
[quote]你写HQL语句 当遇到解析不出的关键字时,Hibernate会直接把它翻译成普通的SQL语句进行操作的[/quote]

我写的HQL里面有解析不出的关键字吗?
谢谢

  • 写回答

5条回答 默认 最新

  • CaiHuajiang 2009-10-11 11:58
    关注

    [code="java"]这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
    Java代码
    session.flush(); [/code]
    这里是不是session.flush,是session.evict(entity);
    还是一句话,要么使用bulk update/delete方式,要么使用操作持久化对象方式,当使用bulk update时,不可避免导致一级缓存的脏读,Hibernate的解决方式仅仅是删除二级缓存。
    所以通常的方式就是直接操作持久化对象,这要不会引起数据库与缓存的不一致。

    [url]http://www.iteye.com/topic/21640[/url]

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

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮