Hibernate查询性能以删除对象

时间:2010-10-05 14:41:12

标签: hibernate

我正在开发一个简单的Web服务: void deleteCar(int idCar)

目前,我在代码中所做的是:
 1 - 通过id加载汽车对象:session.get(Car.class,idCar)
 2 - 删除它:session.delete(carLoaded)

所以对于一个操作我至少有2个sql查询(n + 1问题?)
我甚至没有谈论汽车中任何不太懒的关系会导致更多的SQL查询。

我认为要使用HQL查询:
 1 - 将通过id检查汽车是否存在lockMode.UPGRADE(boolean carDao.exist(int id))  2 - 如果汽车存在,请使用类似这样的hql查询:“来自Car c的delet c.id =?”

缓存如何对此作出反应(我们将使用ehCache)

在第一个解决方案中,我几乎可以肯定汽车会从二级缓存中逐出。

在第二个解决方案(使用hql查询)中,缓存是否足够智能以删除在二级缓存中加载的汽车?

1 个答案:

答案 0 :(得分:0)

  

所以对于一个操作我至少有2个sql查询(n + 1问题?)

当您检索N个实体(具有1个查询)并且需要对每个实体执行额外查询(总共N个)以获取某些内容时,会发生N + 1问题。这不是真的。

  

我甚至没有谈论汽车中任何不太懒惰的关系会导致更多的SQL查询。

好吧,如果你有一个对象图,你需要几个删除查询。 Hibernate可以为你级联它们,你不高兴吗?

  

我曾考虑使用(...)

的HQL查询

首先,我并没有真正看到第一个选择的重点(我认为你想限制查询的数量)。

其次,批量HQL DELETE确实会保存SELECT,但它不会级联到相关实体,这可能是您的问题(因此您必须自己处理关系,如果可能的话)。

不确定它是否符合您的需求。

  

但缓存如何对此

作出反应

完成“批量操作”后,Hibernate将使所需的区域无效。

有关详细信息和使用建议,请参阅Bulk Operations