hibernate 懒加载在真正用到的时候才去加载,hibernate如何判断“真正用到”?

真正用到 4个字对计算机来说太抽象了,Google能搜到的关于懒加载原理的解释,只能到返回代理对象层面,返回PersistentSet,保存了session和owner,利用session去查。然后呢?什么时候去查??????是调get方法(很明显不是)还是toString,还是??????没解释了?
为什么调用get方法时,如果不给其赋值,像这样user.getRoleSet();不会发出sql,如果Set<Role> roles = user.getRoleSet();这样则发出sql?

阅读 4.5k
3 个回答

真正用到=在内存中开辟空间

比如:new

懒汉单例:

public class LazySingleton {

    private static LazySingleton intance = null;
    
    private LazySingleton(){}
    
    public static synchronized LazySingleton getInstance()
    {
        if(intance == null)
        {
            intance = new LazySingleton();
        }
        return intance;
    }
}

get时才new。

就是调用 get 方法的时候,应为返回的是代理对象,调用的 get 并不是原始的 get 方法,而是包装过的。此时代理对象会在 seesion 中检查是否 get 获取的对象已经存在,如果不存在就会发起一条 sql 去查询。如果处理不当会引起 N+1 问题。

比如实体User 关联一个 Address,并且我们设置这个关联address为懒加载,那么当我们load一个User的时候,返回的是一个User的代理,里面仅保存了Address实体的主键(比如我们称之为id)。而Address的其它信息是没有的。当我们调用user.getAddress().getName()的时候(假设Address的field包含id,name,no之类的信息),就是所谓的"真正用到",当然toString是否真正用到,得看你toString方法是怎么实现的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题