当时觉得奇怪 为什么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中的缓存。可以说是治标不治本。