`
senhehe
  • 浏览: 15511 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

hibernate懒加载原理(转)

阅读更多

        当使用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$$5a7c25,

名字很奇怪吧,这个对象是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的也是可以的。

 

 

      原文地址:http://blog.sina.com.cn/s/blog_82faefb00100rwf7.html

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    hibernate懒加载策略.doc

    1. **懒加载的实现原理** - Hibernate通过在映射配置文件中设置`lazy="true"`来启用实体对象的懒加载。例如,在上述配置中,`<class>`标签的`lazy`属性设为`true`,表示User实体将采用懒加载。 - 当使用`session....

    Hibernate实现原理模拟

    **Hibernate实现原理模拟** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本教程将通过模拟Hibernate的实现原理,帮助开发者深入理解其工作方式,以便更好地运用到实际...

    hibernate 延迟加载深入剖析

    ##### 2.2 Hibernate中的延迟加载实现原理 在Hibernate中,延迟加载是通过代理模式实现的。当Hibernate加载一个实体时,默认不会立即加载其关联的实体或集合属性。相反,它会创建一个代理对象来表示这些属性。当...

    懒加载异常解决.docx

    2. **配置不当:** 没有正确配置Hibernate或其他ORM框架来支持懒加载,或者相关的过滤器和拦截器设置不正确。 3. **多线程环境下的问题:** 在多线程环境中,如果对象被多个线程共享,并且在一个线程中关闭了Session...

    Hibernate lazy延迟加载

    **标题**: Hibernate懒加载(Lazy Loading) 在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会...

    SpringBoot-SpringData-懒加载

    **三、懒加载原理** 在JPA中,懒加载是通过代理对象实现的。当实体类中的关联属性被标记为`@ManyToOne`、`@OneToOne`且`fetch = FetchType.LAZY`时,JPA会在运行时创建一个代理对象。当尝试访问这个关联属性时,而...

    hibernate延迟加载技术详细解

    - Hibernate 自动为懒加载属性创建代理类,这些代理类在需要时才加载真实数据。 #### 四、总结 在 Hibernate 中,延迟加载技术是非常关键的一部分,它能够显著提高应用程序的性能。通过合理地选择 Fetching 策略...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    Hibernate原理

    然而,要充分发挥Hibernate的优势,开发者需要深入理解其核心概念和工作流程,合理设计对象关系映射策略,以及掌握其提供的各种高级特性,如懒加载、缓存管理等,才能构建出高性能、高可维护性的企业级应用。

    Hibernate原理解析

    Hibernate提供了懒加载机制,允许延迟加载关联的对象,直到真正需要时才从数据库获取,从而提高性能。而立即加载则会在加载主体对象的同时加载其关联的对象。 8. **实体状态** Hibernate将实体的状态分为四种:瞬...

    Hibernate 工作原理图Hibernate 工作原理图

    - **懒加载**:默认情况下,Hibernate 使用懒加载策略,仅在真正需要时才加载关联的对象。 - **批处理**:通过设置适当的批次大小,可以减少数据库交互次数。 - **查询缓存**:启用查询缓存,可以提高查询性能。 - *...

    理解Hibernate中PO的代理类

    Hibernate懒加载的常见问题之一是代理类初始化问题。如果在持久化上下文(Session)之外或事务结束之后尝试访问懒加载属性,就会引发`LazyInitializationException`异常。为了避免这种情况,需要在配置或代码中妥善...

    Hibernate原理与应用 ppt

    在"Hibernate 原理与应用 ppt"中,主要讲解了Hibernate的基本概念、安装配置、CURD操作、关联映射、继承映射、懒加载、HQL和Criteria查询、缓存管理、事务处理以及最佳实践和与JPA的集成。 **安装配置** 在开始使用...

    hibernate-原理共2页.pdf.zip

    2. **懒加载**:为提高性能,Hibernate允许延迟加载关联对象,只有在真正需要时才加载,降低内存消耗。 **六、性能优化** - 使用批处理更新和检索,通过设置hibernate.jdbc.batch_size参数批量处理SQL。 - 合理...

    Hibernate 原理与配置快速入门(转)

    懒加载(Lazy Loading)是Hibernate的一种优化策略,仅在需要时加载关联对象,而立即加载(Eager Loading)会在获取主体对象时同时加载关联对象。 10. **性能优化** 为了提升性能,可以考虑以下策略: - 使用...

    hibernate的原理详细解说

    - 懒加载是一种延迟加载策略,只有当确实需要时才会从数据库加载关联对象的数据,从而减少不必要的 I/O 操作。 #### Hibernate的优点 - **减少开发成本**:通过自动化的 SQL 生成和对象映射,大大减少了手工编写 ...

    Hibernate框架ORM的实现原理

    Hibernate不仅支持传统的CRUD操作,还提供了缓存机制、事件监听器、懒加载等特性,大大提高了应用的性能和可维护性。 #### 三、ORM的实现原理 ORM的核心在于**映射**,即将数据库表和Java对象之间的关系进行定义,...

    hibernate学习资料大全

    理解并合理运用懒加载,可以避免内存溢出。 10. **性能优化**: Hibernate 提供了多种优化手段,如批处理、预加载、缓存配置等,学习如何根据项目需求进行优化,可以显著提高系统性能。 以上只是压缩包中部分可能...

    hibernate原理小程序(反射)

    总的来说,反射是Hibernate实现ORM功能的关键技术,它使得Hibernate能够灵活地处理对象与数据库之间的映射,提高了开发效率,并且提供了高级特性如懒加载和自动类型转换。然而,合理使用反射也是必要的,过度依赖...

    Hibernate 经典例子全

    通过这些实例,学习者将能深入理解Hibernate的工作原理,并掌握如何在实际项目中运用。对于初学者来说,这些例子提供了宝贵的实践机会,而对于有经验的开发者,它们可以帮助巩固理论知识并探索更高级的用法。

Global site tag (gtag.js) - Google Analytics