- 浏览: 375860 次
- 来自: 北京
文章分类
- 全部博客 (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入门 (二)用户实例
首先是测试表的结构:
先通过hibernate将数据放入数据库,如下:
====================================================
数据加入之后, 看一下检索的方法。
第一种是:
-运行以上方法时,Hibernate将先查询User表中的所有记录,然后根据每条记录的ID,到Order表中查询有关的记录,Hibernate将以此执行以下select语句:
select * from User;
select * from Order where customer_id=1;
select * from Order where customer_id=2;
select * from Order where customer_id=3;
select * from Order where customer_id=4;
上述方法的缺点:
-select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个User对象,那么必须执行n+1次select查询语句。这种检索策略没有利用SQL的链接查询功能。
SQL左外连接检索策略
一.通过配置文件指定自动左外连接检索
例如以上5条select语句完全可以通过以下1挑select语句来完成:
select * from User left outer join Order on User.id = Order.Customer_id
-以上select语句使用了SQL的左外连接查询功能,能够在一条select语句中查询出User表的所有记录,以及匹配的Order表的记录。
在Hibernate中, 多对一的关联配置文件中可以配置使用左外连接检索策略。
把Order.hbm.xml文件的<many-to-one>元素的outer-join属性设置为true,程序执行时就会自动使用左外连接检索策略。
运行结果如下:
通过此方法, 当运行下面的代码时:
就只会像数据库发送一条左外连接的select语句,大大降低了数据库开销。
输出结果:
Hibernate: select order0_.id as id1_1_1_, order0_.test_name as test2_1_1_, order0_.customer_id as customer3_1_1_, user1_.id as id1_3_0_, user1_.test_name as test2_3_0_, user1_.test_age as test3_3_0_ from test_order order0_ left outer join test_user user1_ on order0_.customer_id=user1_.id where order0_.id=?
Tom_Order001
Tom
二. 在程序中显式指定左外连接策略检索
- 以下Session的方法都用于检索OID为1的User对象。
session.createQuery("from User as u where u.id=1");
session.createQuery("from User as u left join fetch u.orders where u.id=1");
在执行第一个方法时,Hibernate会使用映射文件配置的检索策略。
在执行第二个方法时,在HQL语句中显式指定左外连接检索关联的Order对象,因此会覆盖映射文件配置的检索策略。不管在User.hbm.xml文件中<set>元素的lazy属性是true还是false,Hibernate都会执行以下select语句:
select * from User left outer join Order on User.id = Order.customer_id where User.id=1;
先通过hibernate将数据放入数据库,如下:
Session session = HibernateUtil.openSession(); Transaction tx=session.beginTransaction(); User u1=new User(1,"Tom",19); User u2=new User(2,"Mike",19); User u3=new User(3,"Jack",19); User u4=new User(4,"Linda",19); Order o1=new Order(1,"Tom_Order001",u1); Order o2=new Order(2,"Tom_Order002",u1); Order o3=new Order(3,"Mike_Order001",u2); Order o4=new Order(4,"Jack_Order001",u3); Order o5=new Order(5,"Linda_Order001",u4); u1.setOrders(ArraysHelper.asSet(o1,o2)); u2.setOrders(ArraysHelper.asSet(o3)); u3.setOrders(ArraysHelper.asSet(o4)); u4.setOrders(ArraysHelper.asSet(o5)); session.save(u1); session.save(u2); session.save(u3); session.save(u4); tx.commit();
====================================================
数据加入之后, 看一下检索的方法。
第一种是:
List userList=session.createQuery("from User as u").list(); for(User u:userList){ System.out.println(u.getOrders().iterator().next().getName()); }
-运行以上方法时,Hibernate将先查询User表中的所有记录,然后根据每条记录的ID,到Order表中查询有关的记录,Hibernate将以此执行以下select语句:
select * from User;
select * from Order where customer_id=1;
select * from Order where customer_id=2;
select * from Order where customer_id=3;
select * from Order where customer_id=4;
上述方法的缺点:
-select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个User对象,那么必须执行n+1次select查询语句。这种检索策略没有利用SQL的链接查询功能。
SQL左外连接检索策略
一.通过配置文件指定自动左外连接检索
例如以上5条select语句完全可以通过以下1挑select语句来完成:
select * from User left outer join Order on User.id = Order.Customer_id
-以上select语句使用了SQL的左外连接查询功能,能够在一条select语句中查询出User表的所有记录,以及匹配的Order表的记录。
在Hibernate中, 多对一的关联配置文件中可以配置使用左外连接检索策略。
把Order.hbm.xml文件的<many-to-one>元素的outer-join属性设置为true,程序执行时就会自动使用左外连接检索策略。
运行结果如下:
通过此方法, 当运行下面的代码时:
Order order=(Order) session.get(Order.class, 1); System.out.println(order.getName()); System.out.println(order.getUser().getName());
就只会像数据库发送一条左外连接的select语句,大大降低了数据库开销。
输出结果:
Hibernate: select order0_.id as id1_1_1_, order0_.test_name as test2_1_1_, order0_.customer_id as customer3_1_1_, user1_.id as id1_3_0_, user1_.test_name as test2_3_0_, user1_.test_age as test3_3_0_ from test_order order0_ left outer join test_user user1_ on order0_.customer_id=user1_.id where order0_.id=?
Tom_Order001
Tom
二. 在程序中显式指定左外连接策略检索
- 以下Session的方法都用于检索OID为1的User对象。
session.createQuery("from User as u where u.id=1");
session.createQuery("from User as u left join fetch u.orders where u.id=1");
在执行第一个方法时,Hibernate会使用映射文件配置的检索策略。
在执行第二个方法时,在HQL语句中显式指定左外连接检索关联的Order对象,因此会覆盖映射文件配置的检索策略。不管在User.hbm.xml文件中<set>元素的lazy属性是true还是false,Hibernate都会执行以下select语句:
select * from User left outer join Order on User.id = Order.customer_id where User.id=1;
发表评论
-
Connection is read-only. Queries leading to data modification are not allowed。
2014-04-06 21:52 3721<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 1055摘自孔浩视频 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 1292三个实体类对象: 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 2515摘自圣思园 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-21 17:41 590摘自圣思园Hibernate20.一 ... -
Hibernate一对一配置
2013-11-20 21:49 1039摘自圣思园 19.Hibernate的对象检索策略深度解析.a ...
相关推荐
在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码逻辑,使得开发过程更加高效。Hibernate支持两种...
一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是基于类和对象的。你可以通过HQL来查询、更新和删除对象,而无需关心底层的SQL语法。...
本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。...本地SQL检索方式
Hibernate 是一款开源的对象关系映射(ORM)框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。本文档基于魔乐科技李兴华老师的 Hibernate 教程笔记进行整理与扩展,...
标题中的“day36 04-Hibernate检索方式:多表连接查询”表明这是一个关于Hibernate框架的教程,重点讲解如何在Hibernate中进行多表连接查询。在这个主题中,我们将深入探讨Hibernate的ORM(对象关系映射)机制以及...
【Hibernate检索策略】 Hibernate提供三种主要的检索策略:立即检索、延迟检索和迫切左外连接检索。 1. **立即检索**:这种策略将立即加载关联的对象,无论对象是持久化状态还是游离状态。优点是应用程序可以方便...
以上介绍了Hibernate的五种检索方式:导航对象图检索、OID检索、HQL检索、QBC检索以及本地SQL检索。每种检索方式都有其独特的应用场景和特点。在实际开发过程中,根据项目的需求和技术背景选择合适的检索方式,可以...
《J2EE Hibernate-6.ppt》探讨了Hibernate在J2EE环境中的检索策略,主要涉及立即检索策略、延迟检索策略以及迫切左外连接检索策略。 1. **立即检索策略**: 立即检索策略是Hibernate默认的检索方式。在处理一对多...
16.6 在应用程序中显式指定迫切左外连接检索策略 16.7 属性级别的检索策略 16.8 小结 16.9 思考题 第17章 Hibernate的检索方式(上) 17.1 Hibernate的检索方式简介 17.1.1 HQL检索方式 17.1.2 QBC...
Hibernate 是一个流行的 Java 持久层框架,它提供了多种检索数据的方式,包括导航对象图检索、OID 检索、HQL 检索、QBC 检索和本地 SQL 检索等。下面将详细介绍每种检索方式。 一、导航对象图检索 导航对象图检索...
2. **Hibernate ORM**:Hibernate是一个对象关系映射框架,它允许开发者使用Java对象来操作数据库,消除了Java代码和SQL之间的直接耦合。 3. **Hibernate Search**:作为Hibernate的一个扩展,Hibernate Search提供...
- **Hibernate中的n+1查询问题**:当使用默认的立即检索策略时,Hibernate会在检索一个对象的同时检索其关联的所有对象。例如,在一个`Customer`与多个`Order`的关联关系中,如果数据库中有`n`个客户,则Hibernate将...
16.6 在应用程序中显式指定迫切左外连接检索策略 16.7 属性级别的检索策略 16.8 小结 16.9 思考题 第17章 Hibernate的检索方式(上) 17.1 Hibernate的检索方式简介 17.1.1 HQL检索方式 17.1.2 QBC...
16.6 在应用程序中显式指定迫切左外连接检索策略 16.7 属性级别的检索策略 16.8 小结 16.9 思考题 第17章 Hibernate的检索方式(上) 17.1 Hibernate的检索方式简介 17.1.1 HQL检索方式 17.1.2 QBC...
16.6 在应用程序中显式指定迫切左外连接检索策略 16.7 属性级别的检索策略 16.8 小结 16.9 思考题 第17章 Hibernate的检索方式(上) 17.1 Hibernate的检索方式简介 17.1.1 HQL检索方式 17.1.2 QBC...
- **HQL (Hibernate Query Language)**:一种面向对象的查询语言,类似于SQL但更加面向对象。 - **QBC (Query By Criteria)**:基于标准的API提供了一种构建查询条件的方法。 - **本地SQL**:直接执行SQL语句,适用...
### Hibernate检索方式详解 #### 一、概述 Hibernate是一个强大的对象关系映射(ORM)框架,它可以将Java对象与数据库表进行映射,使得开发者能够更方便地进行数据的持久化操作。在Hibernate中,提供了多种检索...
在Hibernate中,针对关联对象的检索,有三种主要的检索策略:立即检索(Eager Fetching)、延迟检索(Lazy Fetching)和迫切左外连接检索(Anxious Left Join Fetching)。下面将详细探讨这三种策略的特点。 #### 1. 立即...