hibernate中的hql更新和对象更新有什么不同

时间:2016-12-20 06:50:27

标签: java hibernate orm

我正在使用hibernate-4.3.11.Final。 如您所知,在数据库中有两种更新方式。 第一个是在存储库中使用hql update,例如:

update Account e 
   set e.count= 12
 where e.id = 123

第二种方式是此对象是通过id从数据库加载的,并且通过此Object的setter方法设置计数(例如,在服务中):

    @Override
    @Transactional
    public boolean changeTempCount(Integer id, Integer count) {
        Account model = iAccountRepository.loadById(id);
        model.setCount(count);
        super.save(model);
        return true;
    }

他们两人都成功地工作了 我想知道他们每个人都比另一个更好或者有什么不同 之间的那些

1 个答案:

答案 0 :(得分:0)

首先,您真正需要了解的一件事是,super.save(model);的调用是不必要的。 Hibernate透明地写入对实体所做的更改,而不需要显式保存任何内容。 Hibernate从数据库加载的实体(使用get(/ / load()方法之一,或查询,或通过关联导航)是托管,这意味着Hibernate跟踪他们的更改并保存它们对你而言。

现在,关于你的问题;

  • HQL更新不会处理乐观并发(即@Version - 带注释的字段):不会检查或更新版本
  • HQL更新不会更新内存中的实体。因此,如果您加载实体,然后执行更新查询,数据库将受到影响,但内存中的实体将保持最初加载到会话中的状态。