当使用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
相关推荐
1. **懒加载的实现原理** - Hibernate通过在映射配置文件中设置`lazy="true"`来启用实体对象的懒加载。例如,在上述配置中,`<class>`标签的`lazy`属性设为`true`,表示User实体将采用懒加载。 - 当使用`session....
**Hibernate实现原理模拟** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本教程将通过模拟Hibernate的实现原理,帮助开发者深入理解其工作方式,以便更好地运用到实际...
##### 2.2 Hibernate中的延迟加载实现原理 在Hibernate中,延迟加载是通过代理模式实现的。当Hibernate加载一个实体时,默认不会立即加载其关联的实体或集合属性。相反,它会创建一个代理对象来表示这些属性。当...
2. **配置不当:** 没有正确配置Hibernate或其他ORM框架来支持懒加载,或者相关的过滤器和拦截器设置不正确。 3. **多线程环境下的问题:** 在多线程环境中,如果对象被多个线程共享,并且在一个线程中关闭了Session...
**标题**: Hibernate懒加载(Lazy Loading) 在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会...
**三、懒加载原理** 在JPA中,懒加载是通过代理对象实现的。当实体类中的关联属性被标记为`@ManyToOne`、`@OneToOne`且`fetch = FetchType.LAZY`时,JPA会在运行时创建一个代理对象。当尝试访问这个关联属性时,而...
- Hibernate 自动为懒加载属性创建代理类,这些代理类在需要时才加载真实数据。 #### 四、总结 在 Hibernate 中,延迟加载技术是非常关键的一部分,它能够显著提高应用程序的性能。通过合理地选择 Fetching 策略...
Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...
然而,要充分发挥Hibernate的优势,开发者需要深入理解其核心概念和工作流程,合理设计对象关系映射策略,以及掌握其提供的各种高级特性,如懒加载、缓存管理等,才能构建出高性能、高可维护性的企业级应用。
Hibernate提供了懒加载机制,允许延迟加载关联的对象,直到真正需要时才从数据库获取,从而提高性能。而立即加载则会在加载主体对象的同时加载其关联的对象。 8. **实体状态** Hibernate将实体的状态分为四种:瞬...
- **懒加载**:默认情况下,Hibernate 使用懒加载策略,仅在真正需要时才加载关联的对象。 - **批处理**:通过设置适当的批次大小,可以减少数据库交互次数。 - **查询缓存**:启用查询缓存,可以提高查询性能。 - *...
Hibernate懒加载的常见问题之一是代理类初始化问题。如果在持久化上下文(Session)之外或事务结束之后尝试访问懒加载属性,就会引发`LazyInitializationException`异常。为了避免这种情况,需要在配置或代码中妥善...
在"Hibernate 原理与应用 ppt"中,主要讲解了Hibernate的基本概念、安装配置、CURD操作、关联映射、继承映射、懒加载、HQL和Criteria查询、缓存管理、事务处理以及最佳实践和与JPA的集成。 **安装配置** 在开始使用...
2. **懒加载**:为提高性能,Hibernate允许延迟加载关联对象,只有在真正需要时才加载,降低内存消耗。 **六、性能优化** - 使用批处理更新和检索,通过设置hibernate.jdbc.batch_size参数批量处理SQL。 - 合理...
懒加载(Lazy Loading)是Hibernate的一种优化策略,仅在需要时加载关联对象,而立即加载(Eager Loading)会在获取主体对象时同时加载关联对象。 10. **性能优化** 为了提升性能,可以考虑以下策略: - 使用...
- 懒加载是一种延迟加载策略,只有当确实需要时才会从数据库加载关联对象的数据,从而减少不必要的 I/O 操作。 #### Hibernate的优点 - **减少开发成本**:通过自动化的 SQL 生成和对象映射,大大减少了手工编写 ...
Hibernate不仅支持传统的CRUD操作,还提供了缓存机制、事件监听器、懒加载等特性,大大提高了应用的性能和可维护性。 #### 三、ORM的实现原理 ORM的核心在于**映射**,即将数据库表和Java对象之间的关系进行定义,...
理解并合理运用懒加载,可以避免内存溢出。 10. **性能优化**: Hibernate 提供了多种优化手段,如批处理、预加载、缓存配置等,学习如何根据项目需求进行优化,可以显著提高系统性能。 以上只是压缩包中部分可能...
总的来说,反射是Hibernate实现ORM功能的关键技术,它使得Hibernate能够灵活地处理对象与数据库之间的映射,提高了开发效率,并且提供了高级特性如懒加载和自动类型转换。然而,合理使用反射也是必要的,过度依赖...
通过这些实例,学习者将能深入理解Hibernate的工作原理,并掌握如何在实际项目中运用。对于初学者来说,这些例子提供了宝贵的实践机会,而对于有经验的开发者,它们可以帮助巩固理论知识并探索更高级的用法。