`
wm1990315
  • 浏览: 4790 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate

    博客分类:
  • java
阅读更多

当使用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对象现在到底是什么呢,它其实是一个代理类,这个类具有查询数据库的能力,当session没有关闭的时候如果我们调用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文件的规则,就可以创建出代理对象。

       Domain对象不应该final的,大家现在应该明白为什么了吧,如果是final的,那么就不可以继承,当然也就不可以产生代理对象,也就不能实现懒加载了,如果你不用懒加载,那么把domain对象设计成fianl的也是可以的。

query使用hsql语句,可以设置参数是常用的一种方式

criteria的方式,尽量避免了写hql语句,看起来更面向对象了。

find方式,这种方式已经被新的hibernate丢弃(3.0)

get和load方式是根据id取得一个记录
下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。

1,从返回结果上对比:
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
get方法检索不到的话会返回null

2,从检索执行机制上对比:
get方法和find方法都是直接从数据库中检索
而load方法的执行则比较复杂
1,首先查找session的persistent Context中是否有缓存,如果有则直接返回
2,如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常
3,如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null
4, 在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target
上,并将initialized=true,如果找不到就抛出异常 。

 

1.搜索不到符合条件的记录,get返回一个null,load会抛出一个ObjectNotFountdException

 

2.load返回实体的代理类实例(查看缓存和二级缓存);但get方法则要分情况:

●能get方法若在 session缓存中找到了该id对应的对象,如果在前一步中被代理过的,其中被load方法使用过或被其它关联对象延迟加载过,则返回的原来的代理对象;

●若该代理对象操作前没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

 

3.load方法充分利用内部缓存和二级缓存,get方法只使用内部缓存,没有就直接查询!所以,如果要利用二级缓存的时候,要用load读取数据。

 

4、读取时机不同(当lazy=true的时候)

 

load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延迟机制(get语句时马上读库);

 

5、从检索执行机制上对比:

get方法和find方法都是直接从数据库中检索

而load方法的执行则比较复杂

● 首先查找session的persistent Context中是否有缓存,如果有则直接返回

●如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常

 

●如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null

●在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target上,并将initialized=true,如果找不到就抛出异常 。

 

分享到:
评论

相关推荐

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...

    最新版本的Struts2+Spring4+Hibernate4框架整合

    项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 二、 项目目的: 整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + ...

    hibernate.5.1.0.jar全部

    包含hibernate所有所需jar包还有一些其他包日志包、jpa支持包等: 列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0....

    Hibernate连接SQLite配置说明和方言代码

    Hibernate连接SQLite配置步骤: 1、添加SQLite库: 1.1、将两个jar包:com.zy.hibernate.dialect.SQLiteDialect.jar、sqlite-jdbc-3.7.2.jar拷贝到“\WEB-INF\lib”文件夹下; 2、配置hibernate: 2.1、将...

    Java Persistence WIth Hibernate 2nd

    Manning出版 Java Persistence With Hibernate 第二版 清晰pdf Hibernate, an open source project that is almost 15 years old. In a recent poll, Hibernate was among the top five tools used by many Java ...

    hibernate-testjar包

    hibernate

    论坛系统项目(Struts 2+Hibernate+Spring实现)

    论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...

    hibernate 资料hibernate 资料hibernate 资料

    hibernate 资料hibernate 资料hibernate 资料hibernate 资料

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate...

    java persistence with hibernate

    Java Persistence with Hibernate is the new bible of Hibernate. As a major revision of the popular Hibernate in Action, it builds on the same single example application to introduce and explain the ...

    hibernate关系映射网址

    hibernate

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip)

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate4.3完整jar包

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate Hibernate5 讲义 PDF

    hibernate5 hibernate PDF 讲义 动力 hibernate ssh hibernate5 节点

    hibernate annotation hibernate3

    hibernate annotation hibernate3

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    深入浅出Hibernate(PDF)第一部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    Hibernate对象的生命周期

    Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期

    hibernate3 hibernate3

    hibernate3hibernate3hibernate3hibernate3hibernate3hibernate3hibernate3hibernate3

    hibernate3.zip 包含hibernate3.jar

    hibernate 用的较频繁的jar包,或者文档

Global site tag (gtag.js) - Google Analytics