hibernate 懒加载

QQ1289714862 2014-07-31 04:46:07
public class User {
private int id;
private String name;
private Team team ;
public class Team {
private int id;
private String name;
private Set<User> users;

team 和user 是一对多关联
User user = (User) session.get(User.class,1);//通过get 方式 获得一个User对象(不是一个代理对象)
System.out.println(user.getClass().getName());
Team team = user.getTeam();
System.out.println(team.getClass().getName());
调用user中getTeam()方法,默认是懒加载,获得一个代理类关键是在这里 我就纳闷了 hibernate是如何做到的? user不是一个代理类 getTeam()应该返回的是Team 类(com.ly.domain.Team) 而不是它 的一个代理类
结果是
    select
user0_.id as id0_0_,
user0_.name as name0_0_,
user0_.team_id as team3_0_0_
from
Users user0_
where
user0_.id=?
com.ly.domain.User
com.ly.domain.Team_$$_javassist_1
...全文
148 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灯光环 2014-07-31
  • 打赏
  • 举报
回复
SQL语句很明显了吧,你取User对象的时候压根就没有去查询Team对象,你的Team对象本身就是空的。你想通过getTeam()让hibernate再自动给你发一条关联查询的SQL去查询Team对象的话,就去掉懒加载。如果你想问为什么默认就是懒加载,这个人家框架就是这样规定的,你看源码也是这样。
QQ1289714862 2014-07-31
  • 打赏
  • 举报
回复
引用 7 楼 wlwlwlwl015 的回复:
引用 4 楼 QQ1289714862 的回复:
[quote=引用 1 楼 QQ1289714862 的回复:]
我是想知道hibernate的实现原理 我明明调用的是getTeam()方法 为什么返回的是 一个代理类
不是返回代理类的问题,因为hibernate在多对一的情况下,查询从属对象默认就是懒加载,不光是many-to-one,one-to-one和one-to-many也是如此。[/quote]我明明调用的是getTeam()方法 hibernate怎么给我生成一个代理类了 hibernate 是怎么去拦截getTeam()方法 并且用cglib 生成一个动态代理类的
小灯光环 2014-07-31
  • 打赏
  • 举报
回复
再说了,你说你要苹果,只是你以为你能得到苹果。人家hibernate可没答应给你苹果。如果不懒加载,你可以得到苹果,可人家hibernate就规定了这种情况默认是懒加载。明白了吗?
小灯光环 2014-07-31
  • 打赏
  • 举报
回复
大致是这样的,hibernate自动创建了一个那个对象的子类作为代理对象,只存放了一个Id,有兴趣你去看下源码。
QQ1289714862 2014-07-31
  • 打赏
  • 举报
回复
引用 6 楼 QQ1289714862 的回复:
引用 2 楼 wlwlwlwl015 的回复:
懒加载得到的就是一个只有id的代理对象,你也可以通过设置去禁止懒加载。
这个我知道 ,我就是不知道hibernate这么实现的 比如我明明要的是一个苹果 但hibernate 给我一个梨 为什么呢 hibernate在哪里做了什么处理呢
这个我知道 我就想知道 hibernatet怎么做到的
小灯光环 2014-07-31
  • 打赏
  • 举报
回复
引用 4 楼 QQ1289714862 的回复:
引用 1 楼 QQ1289714862 的回复:
我是想知道hibernate的实现原理 我明明调用的是getTeam()方法 为什么返回的是 一个代理类
不是返回代理类的问题,因为hibernate在多对一的情况下,查询从属对象默认就是懒加载,不光是many-to-one,one-to-one和one-to-many也是如此。
QQ1289714862 2014-07-31
  • 打赏
  • 举报
回复
引用 2 楼 wlwlwlwl015 的回复:
懒加载得到的就是一个只有id的代理对象,你也可以通过设置去禁止懒加载。
这个我知道 ,我就是不知道hibernate这么实现的 比如我明明要的是一个苹果 但hibernate 给我一个梨 为什么呢 hibernate在哪里做了什么处理呢
zhangsf1982 2014-07-31
  • 打赏
  • 举报
回复
楼上MM正解
QQ1289714862 2014-07-31
  • 打赏
  • 举报
回复
引用 1 楼 QQ1289714862 的回复:
我是想知道hibernate的实现原理 我明明调用的是getTeam()方法 为什么返回的是 一个代理类
  • 打赏
  • 举报
回复
延迟加载(Lazy )主要是hibernate对sql语句的自动生成sql 如果把Lazy设为false就是即时加载就会直接执行把它关联的表也查出来执行这个的时候执行多条sql把数据全部查出来,缺点浪费内存。Lazy=“true” 即为延迟加载,当需要它的关联表的数据时再执行关联表的sql
小灯光环 2014-07-31
  • 打赏
  • 举报
回复
懒加载得到的就是一个只有id的代理对象,你也可以通过设置去禁止懒加载。
QQ1289714862 2014-07-31
  • 打赏
  • 举报
回复

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧