- 浏览: 364496 次
- 来自: 北京
文章分类
- 全部博客 (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 3646<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 1615Caused by: com.mysql.jdbc.exce ... -
Unable to locate appropriate constructor on class
2014-02-20 00:11 1418org.hibernate.hql.internal.ast. ... -
Hibernate的load和get实际应用区分简单实例
2013-12-18 11:58 827今天在看孔浩的CMS视频时候看到的。 在57 -文章管理06 ... -
自定义OpenSessionInViewer过滤器
2013-12-11 12:12 994摘自孔浩视频 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 1250三个实体类对象: public class Team { ... -
QBC与HQL检索
2013-11-28 17:39 0QBC(Query By Criteria) API提供了检索 ... -
Hibernate继承映射
2013-11-28 12:36 610继承映射分为三种情况 1.每个子类一张表 比如说有一个Pers ... -
Hibernate通过Composite-element配置外联表实例 (码)
2013-11-28 11:07 980摘自圣思园Hibenrate 26. 组件映射深度解析 -37 ... -
Hibernate配置复合主键 composite primary key (二)
2013-11-27 16:41 1403摘自圣思园Hibernate 26.组件映射深度解析 上一篇 ... -
Hibernate配置复合主键 composite primary key (一)
2013-11-27 14:15 2406这篇是关于如何配置Hibernate实现复合主键的映射功能。 ... -
Hibernate通过Comparator接口自定义排序规则
2013-11-25 20:42 2469摘自圣思园 Hibernate25.自定义内存排序器详解及符合 ... -
Hibernate配置Set和List
2013-11-25 10:44 1838========================Set==== ... -
Hibernate的Map配置
2013-11-23 16:21 1257摘自圣思园022.Hibernate映 ... -
Hibernate多对多配置
2013-11-21 22:39 840场景: Student和Course,每一个Student有多 ... -
Hibernate一对一配置
2013-11-20 21:49 997摘自圣思园 19.Hibernate的对象检索策略深度解析.a ... -
Hibernate的对象检索策略 (一) SQL左外连接检索策略
2013-11-20 15:32 1092首先是测试表的结构: 先通过hibernate将数据放入 ...
相关推荐
Hibernate延迟加载以及利用Spring 大家看看 参考一下
hibernate延迟加载解决 延迟加载的具体解决方法
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。
深入理解hibernate懒加载技术,正确使用懒加载
Hibernate延迟加载机制.zip
Hibernate延迟加载Hibernate延迟加载
hibernate延迟加载技术详细解 ,http://www.che2.com/提供
Hibernate延迟加载介绍.doc
Hibernate 延迟加载
Hibernate集合属性的延迟加载.doc
Hibernate的延迟加载
关于hibernate延迟加载,有很好的参考价值
Hibernate在查询某个对象时,立即查询与之关联的对象: 1、当select的语句数目太多,需要频繁的访问数据库,会影响查询的性能。 2、在应用程序只需要访问要的对象,而不需要访问与他关联的对象的场景下,加载与之...
hibernate一对多案例,里边用到的jar包我上传过