08-06
02

Hibernate3中通过主键id取得数据对象

关于load()和get()方式的最新认识,在hibernate3中load取出的值只是一个代理对象,那里除了id之外,没有任何值,比如说下面这段代码:
UserStatus status = s1.getStatus(Integer.parseInt(statId));
log.info("测试:"+status.getName());

当使用get()方式时,正常.当使用load()方法时,抛出异常:
引用内容 引用内容
org.hibernate.LazyInitializationException: could not initialize proxy - no Session


深入分析:
在Hibernate中通过主键id取得数据对象有两种方法:
1. get()方法
stu = (Stduent)session.get(Student.class,"1");

get方法特点:
(1).首先在缓存中查找对象,如果没有才到数据库中查找
(2).对象存在时,返回立即检索策略得到的对象,永远不返回代理对象。不管Student.hbm.xml中class标签设置为
lazy="true" 或者lazy="false" ,get方法总是立即检索Student对象。
(3).该id对象不存在时返回NULL

2.load()方法


(1)在立即加载对象时,如果对象存在,load()和get()方法没有区别。都是取得了已经初始化的对象。
如果对象不存在时,则两种方法结果会有异处:
(a)--前面说过get方法对于通过主键查得的对象不存在则返回null
(b)--load()则会抛出异常 org.hibernate.ObjectNotFoundException:No row with the given identifier exists
(2) 延迟加载对象
get方法依然是用立即加载的方式发送SQL语句,并得到已经初始化的对象。而load()则根本不发送SQL语句,
他返回一个代理对象,直到这个对象被访问使用时,此代理对象才会被初始化。
示例:
session begin
stu = (Stduent)session.get(Student.class,"1");
session commit/session close
System.out.println(stu.getId());
System.out.println(stu.getAge());

运行上述代码,在控制台的信息如下:
1
Error LazyInitializationException could not initialize proxy-the owning Session was closed
比较奇怪的是,为何在Session关闭以后还能打印出id值,但却不能打印Age值?这是应为load方法构建了一个代理对象,
此代理对象只拥有主键id,其他的所有属性都未被初始化,所以在脱离Session之后,不能输出代理对象的Age。
所以在关闭session之前,即可以查看student的id和age了。因为它在访问时调用了
select s.* from Student s where s.id=?
进行初始化,获取了age属性。

文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: hibernate3 load get
相关日志:
评论: 0 | 引用: 0 | 查看次数: 836
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭