真正用到 4个字对计算机来说太抽象了,Google能搜到的关于懒加载原理的解释,只能到返回代理对象层面,返回PersistentSet,保存了session和owner,利用session去查。然后呢?什么时候去查??????是调get方法(很明显不是)还是toString,还是??????没解释了?
为什么调用get方法时,如果不给其赋值,像这样user.getRoleSet();不会发出sql,如果Set<Role> roles = user.getRoleSet();这样则发出sql?
真正用到 4个字对计算机来说太抽象了,Google能搜到的关于懒加载原理的解释,只能到返回代理对象层面,返回PersistentSet,保存了session和owner,利用session去查。然后呢?什么时候去查??????是调get方法(很明显不是)还是toString,还是??????没解释了?
为什么调用get方法时,如果不给其赋值,像这样user.getRoleSet();不会发出sql,如果Set<Role> roles = user.getRoleSet();这样则发出sql?
就是调用 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方法是怎么实现的。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
比如:
new
懒汉单例:
get时才new。