我看到了很多hibernate示例和实用代码,在更新某些对象之前,它首先使用它们的身份查询它们,然后设置需要更新的属性,我知道查询它们会附加当前打开会话的对象,并且在提交与会话关联的事务时将进行更新。但是hibernate有很多种方法可以使用它来更新对象,而无需查询fisrt,例如使用hql,会有一个较少的查询,这将有利于性能,那么为什么这么多代码选择查询它在更新之前呢?
答案 0 :(得分:2)
这样做的一个原因是批量操作(UPDATE
和DELETE
)被转换为“纯”SQL并绕过持久性上下文。
以这种方式直接更新数据库中的实体时,如果有问题的实体已经存在于持久性上下文或缓存中,它们将变得陈旧。
如果要避免过时数据,则必须使包含受影响实体的每个缓存无效或重新获取所有可能受影响的实体。