Java Hibernate-从数据库延迟加载和更新单个对象

Java Hibernate-从数据库延迟加载和更新单个对象,java,hibernate,spring-data-jpa,spring-data,Java,Hibernate,Spring Data Jpa,Spring Data,我最近正在努力优化我的应用程序性能,我注意到,当我用MazyTone关系延迟加载一个依赖项时,hibernate提供的对象不仅延迟加载对象本身,还延迟加载它的所有字段——因此,它让我想我是否可以利用它来发挥我的优势 让我们想象一下这样的情况 @Transactional public void updateUserNameToHarry(Long userId){ User u = dao.findById(userId); u.setName("Harry"); }

我最近正在努力优化我的应用程序性能,我注意到,当我用MazyTone关系延迟加载一个依赖项时,hibernate提供的对象不仅延迟加载对象本身,还延迟加载它的所有字段——因此,它让我想我是否可以利用它来发挥我的优势 让我们想象一下这样的情况

@Transactional
public void updateUserNameToHarry(Long userId){
  User u = dao.findById(userId);
  u.setName("Harry");
}
因此,我们打开了一个事务,将Harry加载到我们的持久性上下文中,并更新了他的名字。 一旦事务关闭,Hibernate将发挥其神奇作用,并更新我们拥有的用户实体的名称。 但是,在这个场景中,我真的不需要将Harry db行解析为实体图,将Harry加载到应用程序上下文中,而且我绝对不需要为Harry急切加载的关系做所有这些

所以这里有一个问题——我能以某种方式避免这种情况吗? 理想情况下,我希望Harry是一个延迟加载的对象,在调用setName方法时添加一个更新查询,该查询将在事务提交后执行


我目前正在使用Spring boot 2.0 stack,但我的问题适用于使用java的ORM的任何其他版本和方法。

如果我理解正确,我会想到以下选项:

1-显而易见的一点-根本不加载
用户
,只需自己执行更新查询(
更新用户集名称='Harry',其中id=:userId
)-实现这一点的方法的数量,命名查询,带注释的spring方法等


2-在
EntityManager
中有一个方法,它允许您获取
用户
代理,只需填写其ID,除非您对其执行某些操作,然后加载字段。这对你发布的简单案例没有帮助,但是如果你的
用户
与其他实体有关系,那么你可以从中受益-看看,这是一个完美的解释

繁荣!谢谢Shadov,getReference解决方案工作得很好,我编写了小单元测试并判断SQL日志,hibernate从未实际加载实体,如果我只更新字段,它会生成更新查询,正如我所希望的,它不是完全完美的,因为它生成的更新包含所有实体字段,不仅是我更新过的一次,而且,这还是非常好的。嗯,虽然hibernate确实从数据库加载了实体(如果应用了任何更改),但您可能是对的,这就是为什么我认为可能是这样的原因,即使没有关于它执行此类操作的SQL日志-我注意到,如果我设置的字段值与保存在db中的字段值相等,它也不会记录更新查询,并且hibernate无法知道这一点,除非首先从db中实际加载实体。