`

Hibernate延迟加载案例 (多: 一: 一,附代码)

阅读更多
摘自圣思园Hibernate20.一对一关联及左外连接深度解析  25分钟。


场景:
有三个对象类, Student, IdCard, Team.
Student和IdCard是一对一关系。
而Team和Student是一对多关系。


Student和IdCard的类声明以及映射文件配置和http://alleni123.iteye.com/admin/blogs/1978000这里的类大致一样。  只是Student里面多了一个 private Team team,
以及配置文件里面要加入一个<many-to-one>映射到Team对象。

Team类如下:
public class Team
{
	private String id;
	private String name;
	
	private Set<Student> students;
}

Team配置文件:
	<class name="Team" table="test_team">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>
		 
		 <property name="name" column="name" type="string"/>
		 	
		 <!-- 在一对多的对应关系中,都是让多的一方来维持对应关系,所以在这里设置为true,既由students来维持关系-->
		 <set name="students" [b]lazy="false"[/b] cascade="all" inverse="true">
		 	<key column="team_id"/>
		 	<one-to-many class="Student"/>
		 </set>
		 
		 
	</class>


插入代码:

public class HibernateTeam_1insert
{
	public static void main(String[] args)
	{
		Session session=HibernateUtil.openSession();
		
		Team team=new Team(null,"impl_team",null);
		
		 
		
		
		Student s1=new Student("alleni", null);
		Student s2=new Student("eline",null);
		
		IdCard card1=new IdCard(001, s1);
		
		IdCard card2=new IdCard(002,s2);
		
	 	s1.setIdCard(card1); 
	 	s2.setIdCard(card2);
	 	//如果没这两行,便会报错[url]http://alleni123.iteye.com/admin/blogs/1978483[/url]
	 	
	 	s1.setTeam(team);
	 	s2.setTeam(team);
	 	//如果没有这两行,student对象将不会和team在数据库中关联,并且不会报错。   为了解决这个问题, 可以在Student映射配置文件中配置not-null=true,如此Hibernate便会让Nullability类执行checkNullability().
	 	
		
		
		team.setStudents(ArraysHelper.asSet(s1,s2));
		
		
		Transaction tx=session.beginTransaction();
		
		session.save(team);
		
		tx.commit();
		
		
		
		
	}
}	


代码运行后的数据库如下:






=================================================
查询
延迟加载查询


查询代码如下:
	Session session=HibernateUtil.openSession();
		
	 
	Team team = (Team) session.load(Team.class,"4028bd814279be81014279be84ff0000" );
  System.out.println(team.getName());



Hibernate: select team0_.id as id1_5_0_, team0_.name as name2_5_0_ from test_team team0_ where team0_.id=?
Hibernate: select students0_.team_id as team3_5_2_, students0_.id as id1_4_2_, students0_.id as id1_4_1_, students0_.name as name2_4_1_, students0_.team_id as team3_4_1_, idcard1_.id as id1_1_0_, idcard1_.card_number as card2_1_0_ from test_student students0_ inner join test_idcard idcard1_ on students0_.id=idcard1_.id where students0_.team_id=?


这里Hibernate发出了两条查询语句,第二条我们可以看到很多对象名称,包括student,idcard。
也就是说Hibernate使用了一个inner join查询将所有关联的对象都提取了出来。


之所以会这样, 是因为上面在Team.xml配置文件中,<set>元素的lazy被设置成了false,延迟加载被禁用。
因此即使我们只需要查询team的名字,Hibernate也会使用join方法的SQL来获取所有关联对象的内容。
要解决这个问题, 只要设置Team.xml中的<set>的lazy=true,便能解决。
 //Team.xml
 //<set name="students" lazy="true" cascade="all" inverse="true"  fetch="select">
	Team team = (Team) session.load(Team.class,"4028bd814279be81014279be84ff0000" );
	 	
		   System.out.println(team.getName());

//执行结果
//Hibernate: select team0_.id as id1_5_0_, team0_.name as name2_5_0_ from test_team team0_ where team0_.id=?
//impl_team


这里要注意设置fetch="select",(其实默认就是select)
如果fetch=join,那么即使lazy=true,也还是会通过inner join来进行关联加载。即使这里指查询了team的名称,也会发出一长串join连接的sql语句来查到其它内容。

小知识点:
在Hibernate.cfg.xml中配置property max_fetch_depth的值,可以限制Hibernate在查询时的级联深度, 此方法可以防止Hibernate进行无限止的级联查询,耗费数据库资源。
<property name="hibernate.max_fetch_depth">1</property>
1表示最多进行一级的查询。


这里遇到了一个问题,就是在设置Student和IdCard的延迟加载时,Hibernate没有实现延迟加载。


===============
最后把至今为止hibernate测试的代码传一下。
  • 大小: 87.4 KB
分享到:
评论

相关推荐

    Hibernate延迟加载以及利用Spring

    #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正需要数据时才加载数据,而不是一开始就...

    hibernate抓取策略和懒加载案例

    懒加载案例: ```java public class User { private Long id; @OneToMany(mappedBy = "user", lazy = true) private List&lt;Address&gt; addresses; // getters and setters } public class Address { private Long...

    Hibernate延迟加载原理与实现方法

    Hibernate延迟加载是一种优化数据库操作的技术,它旨在减少不必要的数据库访问,从而提高应用程序的性能。当我们在Hibernate中使用延迟加载时,只有在实际需要数据时,才会从数据库中加载相关对象,而不是在初始加载...

    hibernate3.2详细案例

    3. **懒加载(Lazy Loading)**:延迟加载关联对象,直到实际需要时才从数据库中获取,节省资源。 4. **多态性支持**:允许在同一个集合中存储不同子类的实例,体现面向对象的特性。 总结,这个“Hibernate3.2详细...

    hibernate入门--第一个实例

    - **读取(READ)**: `get()`用于根据ID获取对象,`load()`用于延迟加载,`createQuery()`或`createSQLQuery()`用于执行HQL(Hibernate查询语言)或SQL查询。 - **更新(UPDATE)**: 修改对象属性后,调用`update()`...

    精通Hibernate+源代码

    此外,书中还会涉及Hibernate的性能优化技巧,如延迟加载、批处理和连接池配置,这些都是实际项目中必不可少的知识。同时,作者可能还会讨论Hibernate与其他技术的集成,如Spring框架的整合,以及如何在分布式环境下...

    妙解Hibernate 3.x:叩响面向对象思想之门 PDF

    10. 性能优化:讨论如何通过缓存策略、批处理、延迟加载等手段提高Hibernate应用的性能。 11. 综合案例:通过实际项目案例,展示如何在实际开发中运用Hibernate,解决具体问题。 面向对象思想是现代软件开发的重要...

    02_传智播客hibernate教程_hibernate入门案例的细节分析

    10. **关联映射**:一對一、一对多、多对一、多对多的关系映射实现,包括@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等。 11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存...

    Hibernate 代码

    8. **延迟加载**:Hibernate支持懒加载策略,只有在真正需要数据时才会执行数据库查询,避免了不必要的性能开销。 9. **类型系统**:Hibernate提供了丰富的类型系统,包括基本类型、集合类型和自定义类型,可以满足...

    Accp6.0 Y2 Hibernate1-2章上机练习和课后代码

    8. **懒加载和立即加载**:Hibernate提供了懒加载机制,允许延迟加载关联的对象,直到真正需要时才从数据库获取,从而提高性能。而立即加载则是在初始加载实体时就加载关联的对象。 9. **缓存机制**:Hibernate内置...

    BONC_Hibernate

    - **Lazy Loading**:延迟加载是一种技术,当真正需要数据时才加载,而不是一开始就加载所有数据。 #### 五、总结 **BONC_Hibernate**文档详细介绍了Hibernate框架的基础知识和核心概念,通过丰富的示例帮助初学者...

    Hibernate数据库操作实例.zip

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

    hibernate程序高手秘笈-英文版

    8. **延迟加载和立即加载**:了解何时使用延迟加载和立即加载,以及它们对性能的影响。 9. **性能调优**:通过案例分析,学习如何对Hibernate应用进行性能优化,包括查询优化、减少数据库访问、合理使用缓存等策略...

    hibernate sql案例

    3. 查询优化:包括缓存机制(一级缓存和二级缓存)、批处理操作以及延迟加载(Lazy Loading)等,这些都是提高性能的关键。 4. 数据库事务管理:了解如何在Hibernate中配置和使用事务,保证数据的一致性和完整性。 ...

    hibernate对象关系映射案例demo

    这只是一个起点,深入学习Hibernate,还可以掌握更多的高级特性,如懒加载、级联操作、多对一、一对多、多对多关系映射等。在实际项目中,理解并熟练运用Hibernate,可以显著提升开发效率,降低项目维护成本。

    hibernate学习资源代码

    13. **延迟加载(Lazy Loading)**:为了提高效率,Hibernate支持关联对象的延迟加载,只有在真正需要时才会加载关联数据。 14. **Eclipse集成**:使用Eclipse开发时,可以配置Hibernate插件,方便生成实体类、配置...

    精通Hibernate:Java持久化对象技术详解[第二版]

    7. **性能优化**:讨论如何通过优化配置、批处理、延迟加载、懒加载等手段提高Hibernate的运行效率,减少数据库访问。 8. **实体生命周期**:详解Hibernate对对象状态的管理,包括瞬时态、持久态、游离态和脱管态,...

    beginning hibernate 源代码

    6. **懒加载和代理**:了解Hibernate的懒加载机制,如何通过代理对象延迟加载关联对象,以提高性能。 7. **二级缓存**:研究Hibernate的二级缓存策略,如使用`CacheProvider`和`Region`接口,以及第三方缓存插件如...

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

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

Global site tag (gtag.js) - Google Analytics