hibernate 代理对象是什么意思

ksyahweds 2015-08-05 07:54:07

当试图加载不存在的记录时,load方法可能返回一个未初始化的代理对象
hibernate 代理对象是什么意思
...全文
422 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
a402005AE5DB51ED3 2017-04-22
  • 打赏
  • 举报
回复
当使用session中的load方法查询数据库中的记录时,我们返回的是一个代理对象,而不是真 正需要的那个对象;例如数据库中存有个Student表,我们有cn.binyulan.doman.Student的 领域对象,如果查询Id值为“200626313”的Student stu = (Student)session.load(Student.class,"200626313"),然后我们打印System.out.println(stu.getClass);得到的结果为cn.binyulan.domain.Student$$EnhancerByCGLIB$$5a7cc325,名字很奇怪吧,这个对象是Hibernate帮我们生成的,从名字可以看出它是对Student类的增强类的对象,其实这就是个代理对象,这个对象里并没有我们需要的Student的数据,所以如果你在session关闭后在使用stu来获取信息,如stu.getName();就会出现如下异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session,这就说明了stu中没有我们需要的数据了。 stu对象现在到底是什么呢,它其实是一个代理类,这个类具有查询数据库的能力,当sessi on没有关闭的时候如果我们调用stu.getName()方法;那么这个类会去查询数据库并返回相应 的数据。之后我们关闭session之后再去使用这个类就不会有异常了,可是我们如果调用stu .getName()只是为了让代理类去查数据库,如果别人看我们的代码时候觉得这两句在逻辑上 根本就没有用,别人就很容易注释掉,一注释掉就又会出现异常了,所以hibernate提供了一 个方法Hibernate.initialize(stu);这样就可以初始化这个代理对象了。        不知道大家注意到没有,上面的那句代码Student stu = (Student)session.load(Student.class,"200626313") 把stu强制转化为Student类型,有人会问:不是返回的是代理对象么,那怎么又强制转换成Student了呢,其实代理类是Student 的子类,它具有了比父类更强的能力(数据库查询),这个类是怎么生成的呢?其实hibernate使用了asm.jar和cglig-2.1.3.jar,在内存中修改Student类的字节码,修改后的字节码只要符合class文件的规则,就可以创建出代理对象。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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