`

Hibernate延迟加载简单实例及分析

阅读更多
	Session session = HibernateUtil.openSession();

		Transaction tx = null;

		tx = session.beginTransaction();
		
		User user=(User) session.get(User.class, 538);
	 
		System.out.println(user.getId());
	   
		tx.commit();
		
		session.close();
		
		
		System.out.println(user.getName());


Hibernate在使用get方法时,当程序运行到
User user=(User) session.get(User.class, 538);
就会直接提取出User对象,也就是向数据库发送了select语句。

get方法直接获取实例, 不存在代理。

------------------
这时如果把get换成load, 就会报出一个经典的异常。
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.lj.zhang.User_$$_javassist_0.getName(User_$$_javassist_0.java)
at com.lj.zhang.HibernateTest5_search2.main(HibernateTest5_search2.java:47)


从上面的异常信息可以看出, hibernate通过javassist生成的代理对象进行了invoke()的调用, 我猜测应该就是这里调用了javassist所生成的对象类的查询方法。
这个生成的对象class的查询方法在运行时是要通过hibernate的一系列的配置对象的,既是SessionImpl, 但是这个东西已经关闭, 所以getImplementation压根无法得到任何Session对象。 抛出异常。
--以上纯属瞎猜,具体如何还待以后看了源码才知道。




=========================分割线===============
在mapping配置文件中, 我们可以取消延迟加载 , 通过lazy=false。
  <hibernate-mapping package="com.lj.zhang">
  <class name="User" table="test_user" lazy="false">
当配置了lazy=false之后, 这个User对象便会在session.load()被执行时直接被实例化。 (select语句也会被执行)



		tx.commit();
		
		session.close();
		
		
		System.out.println(user.getName());
		System.out.println(user.getOrders().iterator().next().getName());

于是user.getName()会被正常执行。

这里要注意的就是第二个System.out.println会报错。


Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lj.zhang.User.orders, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180)
at com.lj.zhang.HibernateTest5_search2.main(HibernateTest5_search2.java:48)



这个错误我会想当然的认为, Order配置文件里只要也设置lazy=false,问题就会解决。
事实是这个想法很2,
在Order里面设置这个没有任何作用。
因为Order在main程序中并不是通过load获取的, 而是通过级联获取。

所以重点在一对多的主键那里的配置。也就是User.hbm.xml里面的

<set name="orders" cascade="save-update" inverse="true"   >    <!-- 级联, inverse=true表示由多的一方维持关联关系 -->
  				<!-- key的column告诉hibernate多的一方的foreign key -->
  				<!--  这里设置为customer_id, 就会在数据库的order表里生成相应的 -->
  				<key column="customer_id"></key>
  				<one-to-many class="com.lj.zhang.Order"/>
  			</set>


在set节点里加入 lazy="false",
问题就解决了。

此时通过debug模式可以看到, 程序在运行到
User user=(User) session.load(User.class, 538);
的时候, 便会向数据库发送两条select查询语句。
Hibernate: select user0_.id as id1_2_0_, user0_.test_name as test2_2_0_, user0_.test_age as test3_2_0_ from test_user user0_ where user0_.id=?

Hibernate: select orders0_.customer_id as customer3_2_1_, orders0_.id as id1_0_1_, orders0_.id as id1_0_0_, orders0_.test_name as test2_0_0_, orders0_.customer_id as customer3_0_0_ from test_order orders0_ where orders0_.customer_id=?

这时User以及与之关联的Order对象便有了。 程序正常运行。

分享到:
评论

相关推荐

    Hibernate 延迟加载剖析与代理模式应用

    《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...

    Hibernate延时加载与lazy机制.doc

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

    Hibernate集合属性的延迟加载.doc

    集合属性的延迟加载默认是开启的,这意味着在加载 `Person` 实例时,`addresses` 集合不会立即从数据库加载,除非明确请求。 接着,我们看 `Person` 类的映射文件 `Person.hbm.xml`: ```xml &lt;!-- 省略其他部分 --...

    hibernate简单实例

    以下是对Hibernate简单实例的详细讲解。 1. **Hibernate环境搭建**: 在开始任何操作之前,你需要在项目中引入Hibernate的核心库,包括hibernate-core.jar和其他相关依赖。通常,这些依赖可以通过Maven或Gradle等...

    Hibernate5实例程序

    优化包括合理设置缓存策略、避免N+1查询问题、批量操作、延迟加载等。理解并合理运用这些技巧,可以显著提升Hibernate应用的性能。 通过《Hibernate5实例程序》中的代码示例,读者可以亲手实践上述各个知识点,...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    hibernate入门--第一个实例

    - **懒加载**: Hibernate允许延迟加载关联的对象,直到真正需要时才加载,以提高性能。 - **级联操作**: 可以设置关联关系的级联属性,使得对父对象的操作会自动影响到子对象。 8. **缓存机制** - Hibernate提供...

    eclipse项目Hibernate实例

    10. **性能调优**:了解如何通过批处理、延迟加载、缓存策略等方式提升Hibernate应用的性能。 这个"eclipse项目Hibernate实例"提供了一个实践平台,让你能够亲手操作,加深对Hibernate的理解,并提升Java数据库编程...

    hibernate开发实例源码,由浅入深众多实例

    8. **懒加载和立即加载**:理解延迟加载的概念,优化对象加载策略。 9. **缓存机制**:第一级缓存和第二级缓存的使用,提高性能。 10. **实体生命周期**:了解Hibernate中实体的瞬时、持久化、托管和脱管状态。 11. ...

    hibernate小白极简实例

    对于初学者来说,理解并应用Hibernate可能有些复杂,但通过简单的实例,我们可以快速入门。这个实例将涵盖Hibernate的基础知识,包括注解方式和XML配置方式。 1. **安装与配置** 在开始之前,你需要在项目中添加...

    Hibernate性能(缓存 延迟加载 事务 悲观 乐观锁).ppt

    Hibernate延迟加载(Lazy Loading)** 延迟加载是一种优化策略,只在真正需要数据时才执行数据库查询。例如,当实体对象的集合属性未被访问时,Hibernate不会立即加载这些数据,而是等到需要时才加载,减少不必要的...

    Hibernate数据库操作实例.zip

    7. **延迟加载和立即加载**:理解Hibernate的懒加载机制,以及何时使用立即加载。 8. **事务管理**:了解Hibernate的Transaction API,如何在代码中控制事务的开始、提交、回滚。 9. **Spring与Hibernate集成**:...

    spring+hibernate代码实例集

    总结,这个"spring+hibernate代码实例集"涵盖了Spring和Hibernate的集成应用,包括关系映射、事务管理和延迟加载等核心概念。通过实际的代码示例,开发者可以深入理解并掌握这些技术,提升Java后端开发的能力。

    hibernate 入门经典实例

    - 掌握Hibernate中延迟加载机制的使用。 **实验步骤:** - 设置实体的检索策略为延迟加载,即在真正需要数据时才从数据库中获取。这可以通过配置文件或注解来实现。 #### 实验四:预先抓取 **实验目的:** - ...

    Hibernate实例代码

    **正文** `Hibernate` 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以通过操作...在实际项目中,还需要结合具体需求,学习更多高级特性,如级联操作、延迟加载、缓存机制等。

    Hibernate延迟加载技术详解

    在 Hibernate 框架中,延迟加载(Lazy Loading)是一项核心功能,旨在提高应用程序的性能和效率。它允许数据在真正需要时才从数据库加载,而不是在加载实体时一次性加载所有关联数据。这降低了内存消耗,因为不是...

    Hibernate3.2 实例源码

    2. **延迟加载(Lazy Loading)**: Hibernate 支持延迟加载机制,只有当真正需要数据时才会从数据库加载,提高了程序性能。 3. **级联操作(Cascading)**: 可以设置对象间的级联操作,如删除一个父对象时,可以...

    北软实训jsp(Hibernate框架技术训练)实例

    9. **性能优化**:Hibernate提供了一些性能优化策略,如延迟加载(Lazy Loading)、批处理(Batch Processing)和缓存策略等,帮助我们提高应用程序的运行效率。 10. **实战项目**:在“北软实训jsp(Hibernate框架...

    Hibernate的多对一和一对多操作实例

    ### Hibernate的多对一和一对多操作实例:深入解析与应用 #### 1. 多对一和一对多概念解析 在关系型数据库设计中,多对一和一对多是两种非常基础且重要的关联关系类型。多对一指的是多个实体(如订单)与一个实体...

Global site tag (gtag.js) - Google Analytics