我正在开发一个简单的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查询)中,缓存是否足够智能以删除在二级缓存中加载的汽车?
答案 0 :(得分:0)
所以对于一个操作我至少有2个sql查询(n + 1问题?)
当您检索N个实体(具有1个查询)并且需要对每个实体执行额外查询(总共N个)以获取某些内容时,会发生N + 1问题。这不是真的。
我甚至没有谈论汽车中任何不太懒惰的关系会导致更多的SQL查询。
好吧,如果你有一个对象图,你需要几个删除查询。 Hibernate可以为你级联它们,你不高兴吗?
我曾考虑使用(...)
的HQL查询
首先,我并没有真正看到第一个选择的重点(我认为你想限制查询的数量)。
其次,批量HQL DELETE
确实会保存SELECT
,但它不会级联到相关实体,这可能是您的问题(因此您必须自己处理关系,如果可能的话)。
不确定它是否符合您的需求。
但缓存如何对此
作出反应
完成“批量操作”后,Hibernate将使所需的区域无效。
有关详细信息和使用建议,请参阅Bulk Operations。