- 浏览: 375795 次
- 来自: 北京
文章分类
- 全部博客 (237)
- XML (6)
- JavaSE (39)
- Junit (1)
- Maven (10)
- JavaScript (12)
- JavaEE (16)
- HTML5 (10)
- java多线程 (8)
- Hibernate (30)
- Java反射 (3)
- Spring (11)
- Struts (1)
- svn (2)
- linux (12)
- 代码实例 (1)
- 设计模式 (1)
- UML (1)
- javassist (1)
- Oracle (3)
- Hibernate异常 (9)
- DWR (6)
- Java泛型 (2)
- SpringMVC (11)
- Dbunit (3)
- github (2)
- Algorithm (1)
- zTree (1)
- jquery (7)
- freemarker (4)
- mysql (5)
- ffmpeg (1)
- 编码 (1)
- lucene (15)
- hadoop (1)
- JVM (1)
- Regular Expressions (5)
- myeclipse (1)
- 爬虫 (7)
- 加密 (3)
- WebService (2)
- Socket (2)
- Windows (1)
最新评论
-
wxpsjm:
好直接
HV000030: No validator could be found for type: java.lang.Integer. -
wxhhbdx:
学习了,对新手来说很不错的教程。
SpringMVC入门 (二) 数值传递 -
xgcai:
正好在学dwr
DWR入门 (二)用户实例
摘自圣思园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类如下:
Team配置文件:
插入代码:
代码运行后的数据库如下:
=================================================
查询
延迟加载查询
查询代码如下:
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,便能解决。
这里要注意设置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测试的代码传一下。
场景:
有三个对象类, 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测试的代码传一下。
发表评论
-
Connection is read-only. Queries leading to data modification are not allowed。
2014-04-06 21:52 3720<tx:advice id="txAdvic ... -
org.hibernate.HibernateException: No Session found for current thread
2014-04-06 12:37 0今天在maven中整合spring和hibernate,并使用 ... -
select new Topic from ' Mysql 生成SQL语句错误
2014-03-30 22:51 1653Caused by: com.mysql.jdbc.exce ... -
Unable to locate appropriate constructor on class
2014-02-20 00:11 1460org.hibernate.hql.internal.ast. ... -
Hibernate的load和get实际应用区分简单实例
2013-12-18 11:58 871今天在看孔浩的CMS视频时候看到的。 在57 -文章管理06 ... -
自定义OpenSessionInViewer过滤器
2013-12-11 12:12 1054摘自孔浩视频 spring部分-17_spring_SSH整合 ... -
数据库事务 (三)虚读(Phantom Read)
2013-12-01 13:21 0关于各种读 虚读 phantom read: 转自维基 ... -
Hibernate悲观锁
2013-11-30 17:30 0为了防止两个线程同时修改一个数据,造成更新数据丢失,我们可以使 ... -
Hibernate查询HQL实例
2013-11-29 15:56 1291三个实体类对象: public class Team { ... -
QBC与HQL检索
2013-11-28 17:39 0QBC(Query By Criteria) API提供了检索 ... -
Hibernate继承映射
2013-11-28 12:36 646继承映射分为三种情况 1.每个子类一张表 比如说有一个Pers ... -
Hibernate通过Composite-element配置外联表实例 (码)
2013-11-28 11:07 1015摘自圣思园Hibenrate 26. 组件映射深度解析 -37 ... -
Hibernate配置复合主键 composite primary key (二)
2013-11-27 16:41 1446摘自圣思园Hibernate 26.组件映射深度解析 上一篇 ... -
Hibernate配置复合主键 composite primary key (一)
2013-11-27 14:15 2454这篇是关于如何配置Hibernate实现复合主键的映射功能。 ... -
Hibernate通过Comparator接口自定义排序规则
2013-11-25 20:42 2514摘自圣思园 Hibernate25.自定义内存排序器详解及符合 ... -
Hibernate配置Set和List
2013-11-25 10:44 1877========================Set==== ... -
Hibernate的Map配置
2013-11-23 16:21 1295摘自圣思园022.Hibernate映 ... -
Hibernate多对多配置
2013-11-21 22:39 875场景: Student和Course,每一个Student有多 ... -
Hibernate一对一配置
2013-11-20 21:49 1037摘自圣思园 19.Hibernate的对象检索策略深度解析.a ... -
Hibernate的对象检索策略 (一) SQL左外连接检索策略
2013-11-20 15:32 1137首先是测试表的结构: 先通过hibernate将数据放入 ...
相关推荐
#### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正需要数据时才加载数据,而不是一开始就...
懒加载案例: ```java public class User { private Long id; @OneToMany(mappedBy = "user", lazy = true) private List<Address> addresses; // getters and setters } public class Address { private Long...
Hibernate延迟加载是一种优化数据库操作的技术,它旨在减少不必要的数据库访问,从而提高应用程序的性能。当我们在Hibernate中使用延迟加载时,只有在实际需要数据时,才会从数据库中加载相关对象,而不是在初始加载...
3. **懒加载(Lazy Loading)**:延迟加载关联对象,直到实际需要时才从数据库中获取,节省资源。 4. **多态性支持**:允许在同一个集合中存储不同子类的实例,体现面向对象的特性。 总结,这个“Hibernate3.2详细...
- **读取(READ)**: `get()`用于根据ID获取对象,`load()`用于延迟加载,`createQuery()`或`createSQLQuery()`用于执行HQL(Hibernate查询语言)或SQL查询。 - **更新(UPDATE)**: 修改对象属性后,调用`update()`...
此外,书中还会涉及Hibernate的性能优化技巧,如延迟加载、批处理和连接池配置,这些都是实际项目中必不可少的知识。同时,作者可能还会讨论Hibernate与其他技术的集成,如Spring框架的整合,以及如何在分布式环境下...
10. 性能优化:讨论如何通过缓存策略、批处理、延迟加载等手段提高Hibernate应用的性能。 11. 综合案例:通过实际项目案例,展示如何在实际开发中运用Hibernate,解决具体问题。 面向对象思想是现代软件开发的重要...
10. **关联映射**:一對一、一对多、多对一、多对多的关系映射实现,包括@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等。 11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存...
8. **延迟加载**:Hibernate支持懒加载策略,只有在真正需要数据时才会执行数据库查询,避免了不必要的性能开销。 9. **类型系统**:Hibernate提供了丰富的类型系统,包括基本类型、集合类型和自定义类型,可以满足...
8. **懒加载和立即加载**:Hibernate提供了懒加载机制,允许延迟加载关联的对象,直到真正需要时才从数据库获取,从而提高性能。而立即加载则是在初始加载实体时就加载关联的对象。 9. **缓存机制**:Hibernate内置...
- **Lazy Loading**:延迟加载是一种技术,当真正需要数据时才加载,而不是一开始就加载所有数据。 #### 五、总结 **BONC_Hibernate**文档详细介绍了Hibernate框架的基础知识和核心概念,通过丰富的示例帮助初学者...
7. **延迟加载和立即加载**:理解Hibernate的懒加载机制,以及何时使用立即加载。 8. **事务管理**:了解Hibernate的Transaction API,如何在代码中控制事务的开始、提交、回滚。 9. **Spring与Hibernate集成**:...
8. **延迟加载和立即加载**:了解何时使用延迟加载和立即加载,以及它们对性能的影响。 9. **性能调优**:通过案例分析,学习如何对Hibernate应用进行性能优化,包括查询优化、减少数据库访问、合理使用缓存等策略...
3. 查询优化:包括缓存机制(一级缓存和二级缓存)、批处理操作以及延迟加载(Lazy Loading)等,这些都是提高性能的关键。 4. 数据库事务管理:了解如何在Hibernate中配置和使用事务,保证数据的一致性和完整性。 ...
这只是一个起点,深入学习Hibernate,还可以掌握更多的高级特性,如懒加载、级联操作、多对一、一对多、多对多关系映射等。在实际项目中,理解并熟练运用Hibernate,可以显著提升开发效率,降低项目维护成本。
13. **延迟加载(Lazy Loading)**:为了提高效率,Hibernate支持关联对象的延迟加载,只有在真正需要时才会加载关联数据。 14. **Eclipse集成**:使用Eclipse开发时,可以配置Hibernate插件,方便生成实体类、配置...
7. **性能优化**:讨论如何通过优化配置、批处理、延迟加载、懒加载等手段提高Hibernate的运行效率,减少数据库访问。 8. **实体生命周期**:详解Hibernate对对象状态的管理,包括瞬时态、持久态、游离态和脱管态,...
6. **懒加载和代理**:了解Hibernate的懒加载机制,如何通过代理对象延迟加载关联对象,以提高性能。 7. **二级缓存**:研究Hibernate的二级缓存策略,如使用`CacheProvider`和`Region`接口,以及第三方缓存插件如...
8. **懒加载和立即加载**:理解延迟加载的概念,优化对象加载策略。 9. **缓存机制**:第一级缓存和第二级缓存的使用,提高性能。 10. **实体生命周期**:了解Hibernate中实体的瞬时、持久化、托管和脱管状态。 11. ...