Hibernate中Session类的“update”方法和Query类的“executeupdate”方法有什么区别,什么时候使用?
3 回答
这两种方法在不同的抽象级别上工作:
更新基本上采用它的参数实体,在它的表中找到具有相同主键的行并发出一个
UPDATE
,以便在您提交事务后,该行具有您的参数对象具有的所有信息。此外,如果它们被注释/标记,则更新将级联到所有依赖对象cascade = save-update
。executeUpdate将解析您创建的查询(应该是
UPDATE
orDELETE
语句)并将其发布到数据库。不执行级联或其他逻辑。
何时使用取决于您的需求,正如 bellabax 所说:executeUpdate
对于更新特定表和几行很有用,但update
如果我不处理严格的时间限制(发布多个数据库UPDATE
会更慢),我更喜欢简单性。
简而言之:Session.update()
用于更新单个映射实体;您可以执行Query.executeupdate()
自定义删除/更新语句(编写为 HQL 或纯 SQL)并获得更新/删除的实体计数。
哪种方法正确取决于您的需要:executeupdate()
您可以根据查询删除/更新任意数量的对象,一次update()
只能更新一个对象。
executeUpdate 允许您运行 Hibernate 不支持的本机 SQL 查询。例如,您需要根据某些条件进行更新。
使用 executeUpdate 更强大,但不要在 Hibernate 事务中使用它。给出如下方法:
@@Transactional(readOnly = false)
public void updateLastActivity(VaultUserImpl user, Date lastActivity) {
Query query = getCurrentSession().createQuery("UPDATE VaultUserImpl user set user.lastActivity=:lastActivity where user.id=:id");
query.setDate("lastActivity", lastActivity);
query.setLong("id", user.getId());
query.executeUpdate();
user.setLastActivity(lastActivity);
}
默认情况下,Hibernate 会在事务注解中自动调用更新方法。这意味着上面的查询不仅是必要的,而且很危险,因为我们丢失了数据。
实际上, query.setDate(Date datetime) 不返回完整的日期+时间值,而是仅返回日期。
上面的代码可以很快写出来:
@@Transactional(readOnly = false)
public void updateLastActivity(VaultUserImpl user, Date lastActivity) {
user.setLastActivity(lastActivity);
}