Hibernate 休眠查询性能以删除对象

Hibernate 休眠查询性能以删除对象,hibernate,Hibernate,我正在开发一个简单的web服务: void deleteCar(int idCar) 目前,我在代码中所做的是: 1-按id:session.get(car.class,idCar)加载car对象 2-删除它:会话。删除(已装载) 因此,对于一个操作,我至少有两个sql查询(n+1问题?) 我甚至没有提到汽车中任何会导致更多SQL查询的非懒惰关系 我认为使用HQL查询: 1-将通过id检查车辆是否存在lockMode.UPGRADE(布尔值carDao.exist(int id)) 2-如果ca

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

目前,我在代码中所做的是:
1-按id:session.get(car.class,idCar)加载car对象
2-删除它:会话。删除(已装载)

因此,对于一个操作,我至少有两个sql查询(n+1问题?)
我甚至没有提到汽车中任何会导致更多SQL查询的非懒惰关系

我认为使用HQL查询:
1-将通过id检查车辆是否存在lockMode.UPGRADE(布尔值carDao.exist(int id)) 2-如果car存在,使用如下hql查询:“从car c删除,其中c.id=?”

但是缓存可能对此有何反应(我们将使用ehCache)

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

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

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

当您检索N个实体(使用1个查询)并且需要对每个实体执行额外的查询(总共N个)以获取某些内容时,就会出现N+1问题。事实并非如此

我甚至没有提到汽车中任何会导致更多sql查询的非懒惰关系

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

我曾想过使用一个HQL查询(…)


首先,我真的不明白第一次选择的意义(我以为你想限制查询的数量)

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

不确定它是否适合你的需要

但是缓存会对此做出什么反应呢

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


有关其使用的详细信息和建议,请参阅。

“首先,我不太明白首次选择的意义(我以为您想限制查询的数量)。“是的,但我不知道如何在不先加载对象的情况下删除对象(使用session.delete(objectLoaded)…”。没有第一次加载,你还有其他方法吗?@mada:好吧,你不需要像你的例子那样在使用时首先加载。我如何强制休眠以不使区域缓存无效?因为我可以这样做:坦斯克!有没有办法强制休眠,使相关区域不失效?因为我只想使特定的对象无效,比如:sessionFactory.getCache().executeEntity(entityClass,identifier)@mada,我不这么认为。如果您想自己处理事情,我认为您必须绕过Hibernate的查询API(criteria、HQL、native),使用原始JDBC和
doWork()
API。