hibernate 懒加载不懂 求解.

wangdbeyond 2010-08-12 03:34:59
public static void main(String[] args) {
User user = new User();
user.setBirthday(new Date());
user.setName("wang.beyond");
addUser(user);

User user1 = getUser1(user.getId());
System.out.println("id: "+user1.getId());
System.out.println("name: "+user1.getName());
System.out.println("birthday: "+user1.getBirthday());
System.out.println("end");
}


-----------------------------------------
/**
* 用懒加载的方法得到数据操作
* */
static User getUser1(int id){
Session s = null;
Transaction tx = null;
try {
/**生成session*/
s = HibernateUtil.getSession();
User user = (User)s.load(User.class, id);
System.out.println("id: "+user.getId());
return user;
}finally{
if(s != null)
s.close();
}
}



为什么在懒加载函数User user = (User)s.get(User.class, id); 后面加一句System.out.println("id: "+user.getId()); 在main函数就能取到相应的数据了
有人说加载了user.getId()就表示告诉hibernate这个时候要读取数据 我把System.out.println("id: "+user.getId()); 删了 main函数里面还是有类似的方法 为什么就不能取到数据?
...全文
109 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdbeyond 2010-08-15
  • 打赏
  • 举报
回复
谢谢大家的回答
liujun822 2010-08-13
  • 打赏
  • 举报
回复
lz要明白hibernate中调用get方法首先是出一级缓存中去取数据,如果没有在会去数据库中进行查询。所以当楼主执行了get方法之后就会去缓存中找,如果有就取出来,如果没有就直接想数据库发送sql语句,所以在出现了楼主的这种情况,楼主注意hibernate中get方法与load的区别,
xianaofei 2010-08-13
  • 打赏
  • 举报
回复
学习了
sustbeckham 2010-08-13
  • 打赏
  • 举报
回复
懒加载的我的看法。。
spring容器在最开始不是要把里边所有的bean要初始化吗?
设置为lazy为true后,就不初始化这个bean,等到用到它的时候在进行加载,也可以理解为是一种合理利用资源的方式吧,等到用的时候才用!
cmdmg 2010-08-13
  • 打赏
  • 举报
回复
1、Transient 透明状态
2、Persistent 持久化状态
3、Detached 托管状态
save、update。。。操作时 1-->2 3-->2 也就是持久化操作
delete、clear、close。。。操作时 2-->1 2-->3 持久化状态转为透明或托管状态
aisino_hjp 2010-08-13
  • 打赏
  • 举报
回复
LZ要好好学习的对象的几个状态的转变!这样对HIBERNATE的理解将会更加的深刻!
Inhibitory 2010-08-13
  • 打赏
  • 举报
回复
懒加载与Hibernate从数据库中查出来的对象的状态有关:瞬时对象,持久对象,脱管对象。去网上搜索这几个相关的信息,相信你会理解得更好。
满意 2010-08-13
  • 打赏
  • 举报
回复
Session的生命周期你知道吗?
Session只有在持久的状态时才能等到数据,
游离状态时是不能取到数据的。

static User getUser1(int id){
Session s = null;
Transaction tx = null;
User user = new User();//初始化
/**生成session*/
s = HibernateUtil.getSession();
user = (User)s.load(User.class, id);//这时的user处于游离状态;
System.out.println("id: "+user.getId());
s.close();
return user;//持久的

试试行不。
jayqean 2010-08-12
  • 打赏
  • 举报
回复
后面加一句System.out.println("id: "+user.getId()); 在main函数就能取到相应的数据了
根本就没关系 只有在session生命周期内 user.getName() user.get...后才会去查询数据库
happyfmy 2010-08-12
  • 打赏
  • 举报
回复
因为你的session已经关闭了
离开了getUser1方法 session就关闭了

67,513

社区成员

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

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