Hibernate中 session.delete()疑问?

当时觉得奇怪 为什么Hibernate实现的 session.delete(String hql);是先 session.find(String hql) 然后在查找的结果集中一个一个的删掉。因为要是想sql中的 delete  from table where ......是非常容易的。这其中肯定存在着一些难言之隐。

今天在公交车上找到了答案。

原来最终祸首都是 Hibernate Cache。

Hibernate之所以要一个一个删,也就是为了维护hibernate中的内部缓存和sessionFactory缓存。

试想下假如我把数据库中的数据删了,但是hibernate中的对应缓存没有清理,当用户再次查询的时候可能会得到缓存中的数据(实际上在数据库中的数据已经删除),这样的话就是变成一个bug了。

但是我想为什么不可以在删除之前去维护Hibernate中的缓存呢? 然后还是用一条sql去删除。(这样的话性能还是会比现在的快得多, 一条select 语句和一条delete语句, 现在是一条select语句和多条delete语句)

但我得到的答案是假如这样做的话 Hibernate就相当实现了一个支持sql的内存数据库,这样对于一个轻量集的ormapping来说是太苛刻了。

那我们遇到批量删除该怎么办呢? 我们可以hibernate.jdbc.batch_size = 25来适当的提高性能。

在hibernate3中可以使用  session.createQuery("delete from TUser") 来解决,但是还是没有维护Hibernate中的缓存。可以说是治标不治本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate Session 是一个非常重要的对象,它用于管理 Hibernate 对象的生命周期,提供了对 Hibernate 操作的一系列方法。Session 对象代表了应用程序和数据库之间的一次会话,可以用于执行各种 CRUD 操作、查询、缓存管理等功能。 具体来说,Session 对象在 Hibernate 的作用如下: 1. 管理对象生命周期:Session 对象用于管理 Hibernate 对象的生命周期,包括对象的创建、持久化、加载、更新、删除等操作。通过 Session 对象,可以将 Java 对象映射到数据库表的记录,并通过 Session 对象来维护这些对象和记录之间的关系。 2. 提供事务支持:Session 对象提供了事务支持,可以通过 beginTransaction() 方法启动一个事务,通过 commit() 或 rollback() 方法来提交或回滚事务。Session 对象的所有操作都在一个事务执行,保证了数据的一致性和完整性。 3. 执行 CRUD 操作:Session 对象提供了各种 CRUD 操作方法,包括 save()、update()、delete() 等方法,可以用于对数据库进行插入、更新和删除操作。 4. 执行查询操作:Session 对象提供了各种查询方法,包括 get()、load()、createQuery()、createCriteria() 等方法,可以用于查询数据库的数据。 5. 管理缓存:Session 对象还提供了一系列方法来管理 Hibernate 的缓存,包括 evict()、clear()、flush() 等方法,可以用于清除缓存、强制刷新等操作。 6. 处理懒加载:Hibernate 的懒加载是指只有在需要访问对象的某些属性时才会从数据库加载这些属性的值,Session 对象可以用于处理懒加载,保证在需要访问属性时才会从数据库加载数据,提高了系统的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值