- 浏览: 253721 次
- 性别:
- 来自: 上海
最新评论
-
lazyox_2008:
多谢楼主配对那一段,解决了我的大问题啊
android蓝牙主动发起配对实例 -
yandol:
这个反射的createBond用法很有意思 这个代码能像非an ...
android蓝牙主动发起配对实例 -
hzxlb910:
例子还是短小看着一目了然。不错
初识AOP -
lteb2002:
在WEB中,是使用WebApplicationContext的 ...
[转]Spring中WebApplicationContext的研究 -
Mark_dev:
请问一下楼主,这个UUID是不是和设备有关啊,我使用你的 co ...
android蓝牙主动发起配对实例
百事通信息网
我的demo小程序随着我学习的过程、体积也越来越庞大起来了、开始只是用来测试hibernate、渐渐的Spring,struts,dwr(我在用来做验证的过程因为异步,效果反而不好,所以后来拿掉了)的身影也出现了,到如今他已经有注册、登陆、发贴、查看主题、查看跟贴,回贴的能耐了,呵呵,为他而高兴。在前面学习的过程中先避开一些难点,比如多表查询、AOP切面编程等等,不过为了满足需求,今天开始将多表应用上去了,确实遇到了不少麻烦,花了不少的时间,当然在遇到问题,解决问题的过程中让我回顾了很多要点、盲点,也值了。
现在将关键点记录下来,以免日后再有相同问题出现,以便查阅。
二张表分别为用户表(users)和贴子表(notes),其中users中的userid是notes表的外键,users跟notes是一对多,多对一关系,由myEclpise自动生成映射文件
Users.hbm.xml
Notes.hbm.xml
注意:如果多表查询,在写HQL语句时取notes的userid字段不能写notes.userid(这个问题下午我查了好久,才找到原因的)
HQL语句:From Notes notes,Users users WHERE notes.users=users.userid AND notes.issubject=1
又一注意点:该查询结果为存放对象数组的list集,可以用以下代码测试
在jsp页面显示结果的时候我觉得用EL表达式会简单的多,如:
是的,list中存放你所查询对po的集合,多个对象以数组构建list
Hibernate文档里面有说明,应该多看看文档
19.1.1. Working with lazy associations
By default, Hibernate3 uses lazy select fetching for collections and lazy proxy fetching for single-valued associations. These defaults make sense for almost all associations in almost all applications.
Note: if you set hibernate.default_batch_fetch_size, Hibernate will use the batch fetch optimization for lazy fetching (this optimization may also be enabled at a more granular level).
However, lazy fetching poses one problem that you must be aware of. Access to a lazy association outside of the context of an open Hibernate session will result in an exception. For example:
Since the permissions collection was not initialized when the Session was closed, the collection will not be able to load its state. Hibernate does not support lazy initialization for detached objects. The fix is to move the code that reads from the collection to just before the transaction is committed.
Alternatively, we could use a non-lazy collection or association, by specifying lazy="false" for the association mapping. However, it is intended that lazy initialization be used for almost all collections and associations. If you define too many non-lazy associations in your object model, Hibernate will end up needing to fetch the entire database into memory in every transaction!
On the other hand, we often want to choose join fetching (which is non-lazy by nature) instead of select fetching in a particular transaction. We'll now see how to customize the fetching strategy. In Hibernate3, the mechanisms for choosing a fetch strategy are identical for single-valued associations and collections.
这种设计使用hibernate无疑是鸡肋表现,无法解决。
那什么样的设计才使用hibernate呢?
这种设计使用hibernate无疑是鸡肋表现,无法解决。
Users(POJO)中没有userid成员
这样做很好啊,不如用排序组合算法算了。拿出数据集合还需新组装成页面需求集合,几乎说是严重浪费人力物力表现。真不知道你是如何想得。
我的demo小程序随着我学习的过程、体积也越来越庞大起来了、开始只是用来测试hibernate、渐渐的Spring,struts,dwr(我在用来做验证的过程因为异步,效果反而不好,所以后来拿掉了)的身影也出现了,到如今他已经有注册、登陆、发贴、查看主题、查看跟贴,回贴的能耐了,呵呵,为他而高兴。在前面学习的过程中先避开一些难点,比如多表查询、AOP切面编程等等,不过为了满足需求,今天开始将多表应用上去了,确实遇到了不少麻烦,花了不少的时间,当然在遇到问题,解决问题的过程中让我回顾了很多要点、盲点,也值了。
现在将关键点记录下来,以免日后再有相同问题出现,以便查阅。
二张表分别为用户表(users)和贴子表(notes),其中users中的userid是notes表的外键,users跟notes是一对多,多对一关系,由myEclpise自动生成映射文件
Users.hbm.xml
...... <set name="noteses" inverse="true"> <key> <column name="userid" not-null="true" /> </key> <one-to-many class="com.note.model.Notes" /> </set> ......
Notes.hbm.xml
...... <many-to-one name="users" class="com.note.model.Users" fetch="select"> <column name="userid" not-null="true" /> </many-to-one> ......
注意:如果多表查询,在写HQL语句时取notes的userid字段不能写notes.userid(这个问题下午我查了好久,才找到原因的)
HQL语句:From Notes notes,Users users WHERE notes.users=users.userid AND notes.issubject=1
又一注意点:该查询结果为存放对象数组的list集,可以用以下代码测试
page=ins.listSubjects(page);//page是我的分页类,并存放了查询后的返回结果 List list=page.getResult(); System.out.println(page.getPageToolBar()); for(int i=0;i<list.size();i++){ Object[] obj=(Object[])list.get(i); for(int j=0;j<obj.length;j++){ if(obj[j] instanceof Notes){ Notes note=(Notes)obj[j]; System.out.print(note.getTitle()); }else if(obj[j] instanceof Users){ Users user=(Users)obj[j]; System.out.print(user.getUsername()); } } System.out.println(); }
在jsp页面显示结果的时候我觉得用EL表达式会简单的多,如:
<logic:present name="subjects"> <table width="100%" border="1" rules="rows" frame="below" cellpadding="5" cellspacing="0" bordercolorlight="#6C7BA6" bordercolordark="#ffffff" bgcolor="#DEEFFF" class="DoubleColorTable"> <logic:present name="subjects" property="result"> <logic:iterate id="objs" name="subjects" indexId="number" property="result"> <tr> <td> <html:link page="/listFollow.do?method=listFollow&subjectId=${objs[0].noteid}" styleId="link001"> 主题:${objs[0].title} </html:link> </td> <td> 作者:${objs[1].username} </td> <td> 发贴时间:${objs[0].addtime} </td> </tr> </logic:iterate> </logic:present> </table> <bean:write name="subjects" property="pageToolBar" filter="false" /> </logic:present>
评论
18 楼
379548695
2007-09-19
好东西欧
17 楼
magic.chen
2007-09-11
请问:延迟加载能支持多表查询吗?支持的话,怎么去掉重复数据(set吗?),那要是排序呢?
16 楼
sun113
2006-11-12
有收获,写得不赖!
15 楼
wiley
2006-11-11
sun113 写道
又一注意点:该查询结果为存放对象数组的list集,可以用以下代码测试
请问list集中存放的是什么,使相关的user对象和note对象,对不对?
请问list集中存放的是什么,使相关的user对象和note对象,对不对?
是的,list中存放你所查询对po的集合,多个对象以数组构建list
14 楼
sun113
2006-11-11
又一注意点:该查询结果为存放对象数组的list集,可以用以下代码测试
请问list集中存放的是什么,使相关的user对象和note对象,对不对?
请问list集中存放的是什么,使相关的user对象和note对象,对不对?
13 楼
andyao
2006-11-09
wiley 写道
[quote=ppm10103 ]hibernate多表查询时可以采用延迟加载来提高效率,这应该是一种方法吧,不过我还有一个问题,在1:N的情况下,如果是1:10000那延迟加载时是不是会把10000条都加载进来,能不能控时加载数量呀?
--------
延迟加载加载的是代理类,如果不显示访问是不会加载内容的,
如果允许外连接也要控制一下连接深度
今天用DWR+Spring做整合时,发现真的跟你说的一样,确实是只要显式访问时才加载,不过通过DWR去迟加载时说session已被关闭.这个问题怎么解决呢
--------
延迟加载加载的是代理类,如果不显示访问是不会加载内容的,
如果允许外连接也要控制一下连接深度
今天用DWR+Spring做整合时,发现真的跟你说的一样,确实是只要显式访问时才加载,不过通过DWR去迟加载时说session已被关闭.这个问题怎么解决呢
Hibernate文档里面有说明,应该多看看文档
19.1.1. Working with lazy associations
By default, Hibernate3 uses lazy select fetching for collections and lazy proxy fetching for single-valued associations. These defaults make sense for almost all associations in almost all applications.
Note: if you set hibernate.default_batch_fetch_size, Hibernate will use the batch fetch optimization for lazy fetching (this optimization may also be enabled at a more granular level).
However, lazy fetching poses one problem that you must be aware of. Access to a lazy association outside of the context of an open Hibernate session will result in an exception. For example:
s = sessions.openSession(); Transaction tx = s.beginTransaction(); User u = (User) s.createQuery("from User u where u.name=:userName") .setString("userName", userName).uniqueResult(); Map permissions = u.getPermissions(); tx.commit(); s.close(); Integer accessLevel = (Integer) permissions.get("accounts"); // Error!
Since the permissions collection was not initialized when the Session was closed, the collection will not be able to load its state. Hibernate does not support lazy initialization for detached objects. The fix is to move the code that reads from the collection to just before the transaction is committed.
Alternatively, we could use a non-lazy collection or association, by specifying lazy="false" for the association mapping. However, it is intended that lazy initialization be used for almost all collections and associations. If you define too many non-lazy associations in your object model, Hibernate will end up needing to fetch the entire database into memory in every transaction!
On the other hand, we often want to choose join fetching (which is non-lazy by nature) instead of select fetching in a particular transaction. We'll now see how to customize the fetching strategy. In Hibernate3, the mechanisms for choosing a fetch strategy are identical for single-valued associations and collections.
12 楼
wiley
2006-11-09
[quote=ppm10103 ]hibernate多表查询时可以采用延迟加载来提高效率,这应该是一种方法吧,不过我还有一个问题,在1:N的情况下,如果是1:10000那延迟加载时是不是会把10000条都加载进来,能不能控时加载数量呀?
--------
延迟加载加载的是代理类,如果不显示访问是不会加载内容的,
如果允许外连接也要控制一下连接深度
今天用DWR+Spring做整合时,发现真的跟你说的一样,确实是只要显式访问时才加载,不过通过DWR去迟加载时说session已被关闭.这个问题怎么解决呢
--------
延迟加载加载的是代理类,如果不显示访问是不会加载内容的,
如果允许外连接也要控制一下连接深度
今天用DWR+Spring做整合时,发现真的跟你说的一样,确实是只要显式访问时才加载,不过通过DWR去迟加载时说session已被关闭.这个问题怎么解决呢
11 楼
ppm10103
2006-11-06
hibernate多表查询时可以采用延迟加载来提高效率,这应该是一种方法吧,不过我还有一个问题,在1:N的情况下,如果是1:10000那延迟加载时是不是会把10000条都加载进来,能不能控时加载数量呀?
--------
延迟加载加载的是代理类,如果不显示访问是不会加载内容的,
如果允许外连接也要控制一下连接深度
--------
延迟加载加载的是代理类,如果不显示访问是不会加载内容的,
如果允许外连接也要控制一下连接深度
10 楼
wiley
2006-11-05
hibernate多表查询时可以采用延迟加载来提高效率,这应该是一种方法吧,不过我还有一个问题,在1:N的情况下,如果是1:10000那延迟加载时是不是会把10000条都加载进来,能不能控时加载数量呀?
9 楼
wiley
2006-11-02
santafeng 写道
wiley 写道
to:santafeng
我也是初学hibernate,并不是很深入,你能详述你在多表查询时的做法吗?谢谢
引用
这样做很好啊,不如用排序组合算法算了。拿出数据集合还需新组装成页面需求集合,几乎说是严重浪费人力物力表现。真不知道你是如何想得。
我也是初学hibernate,并不是很深入,你能详述你在多表查询时的做法吗?谢谢
这种设计使用hibernate无疑是鸡肋表现,无法解决。
那什么样的设计才使用hibernate呢?
8 楼
santafeng
2006-11-02
wiley 写道
to:santafeng
我也是初学hibernate,并不是很深入,你能详述你在多表查询时的做法吗?谢谢
引用
这样做很好啊,不如用排序组合算法算了。拿出数据集合还需新组装成页面需求集合,几乎说是严重浪费人力物力表现。真不知道你是如何想得。
我也是初学hibernate,并不是很深入,你能详述你在多表查询时的做法吗?谢谢
这种设计使用hibernate无疑是鸡肋表现,无法解决。
7 楼
wiley
2006-11-02
to:santafeng
我也是初学hibernate,并不是很深入,你能详述你在多表查询时的做法吗?谢谢
引用
这样做很好啊,不如用排序组合算法算了。拿出数据集合还需新组装成页面需求集合,几乎说是严重浪费人力物力表现。真不知道你是如何想得。
我也是初学hibernate,并不是很深入,你能详述你在多表查询时的做法吗?谢谢
6 楼
wiley
2006-11-02
引用
注意:如果多表查询,在写HQL语句时取notes的userid字段不能写notes.userid(这个问题下午我查了好久,才找到原因的)
HQL语句:From Notes notes,Users users WHERE notes.users=users.userid AND notes.issubject=1
问下 为何不能写成notes.userid 而要notes.users?
HQL语句:From Notes notes,Users users WHERE notes.users=users.userid AND notes.issubject=1
问下 为何不能写成notes.userid 而要notes.users?
Users(POJO)中没有userid成员
5 楼
jd2bs
2006-11-02
注意:如果多表查询,在写HQL语句时取notes的userid字段不能写notes.userid(这个问题下午我查了好久,才找到原因的)
HQL语句:From Notes notes,Users users WHERE notes.users=users.userid AND notes.issubject=1
问下 为何不能写成notes.userid 而要notes.users?
HQL语句:From Notes notes,Users users WHERE notes.users=users.userid AND notes.issubject=1
问下 为何不能写成notes.userid 而要notes.users?
4 楼
santafeng
2006-11-02
这样做很好啊,不如用排序组合算法算了。拿出数据集合还需新组装成页面需求集合,几乎说是严重浪费人力物力表现。真不知道你是如何想得。
3 楼
cncomkyle
2006-11-01
我把你的查选考虑成外连接了,如果是外连接,会有出现null的情况
2 楼
wiley
2006-11-01
obj[j]应该不会出现null,只有list才有可能出现null所以在循环外加if判断就可以了
1 楼
cncomkyle
2006-11-01
if(obj[j] instanceof Notes){
Notes note=(Notes)obj[j];
System.out.print(note.getTitle());
}else if(obj[j] instanceof Users){
Users user=(Users)obj[j];
System.out.print(user.getUsername());
}
当obj[j]为null时的情况,怎么样处理呢
Notes note=(Notes)obj[j];
System.out.print(note.getTitle());
}else if(obj[j] instanceof Users){
Users user=(Users)obj[j];
System.out.print(user.getUsername());
}
当obj[j]为null时的情况,怎么样处理呢
发表评论
-
android数据库操作(二)
2011-11-12 00:45 1492package cn.madfinger.android.co ... -
android数据库操作(一)
2011-10-31 13:18 1775为了以后的项目使用Android数据库更方便,自已写了一个小的 ... -
android蓝牙主动发起配对实例
2011-09-24 08:39 25563package cn.madfinger.core; i ... -
最给力的办公平台
2011-02-24 01:02 1589SUCANG协同采用AJAX、J2EE、MV ... -
DWR应用总结
2006-11-11 10:47 10035百事通信息网 配置调试: DWR的配置说明,网上已经是N多 ... -
[求教]关于DWR+Spring延迟加载的问题
2006-11-09 12:10 7126百事通信息网 今天用DWR+Spring做整合时,发现不能通 ... -
[转]Hibernate应用中如何处理批量更新和批量删除?
2006-11-02 10:36 10199百事通信息网 在Hibernate应用中如何处理批量更新和 ... -
初识AOP
2006-11-02 00:07 4370百事通信息网 学习Spring AOP之前,先来了 ... -
AOP的应用领域
2006-11-01 11:46 2559百事通信息网 AOP的应用领域: Authentica ... -
spring+hibernate之applicationContext.xml配置
2006-10-27 20:31 39701百事通信息网 最近一段时间潜心自学struts,spring ... -
Spring用回调HibernateCallBack方法
2006-10-27 20:28 7669百事通信息网 Spring用回调HibernateCall ... -
[转]Spring中WebApplicationContext的研究
2006-10-27 20:27 5932百事通信息网 作者:laoer 引自:http://b ... -
struts+spring整合测试
2006-10-27 20:24 6805百事通信息网 struts+spr ... -
将action得到的值,通过request显示到页面中
2006-10-27 20:13 2509百事通信息网 今天又遇到一个问题,将action ... -
WEB分页技术
2006-10-27 19:49 3929百事通信息网 web应用开发中,分页是一项很重要的技术,分 ... -
DWR+SPRING整合
2006-10-27 19:41 3520百事通信息网 Ajax,它 ... -
按步就班使用struts验证框架
2006-10-26 22:19 4097使用动态FormBean与struts验证框架 第一步,安装 ... -
[转]Log4J 最佳实践之全能配置文件
2006-10-26 16:39 1533LOG4J的配置之简单使它遍及于越来越多的应用中了:Log4J ... -
[转]Log4J 最佳实践之全能配置文件
2006-10-26 16:38 1511LOG4J的配置之简单使它遍及于越来越多的应用中了:Log4J ... -
[转]关于hibernate中的锁机制
2006-10-26 14:57 1630(转载)关于hibernate中的 ...
相关推荐
hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的
### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。...希望本文能对你理解Hibernate的多表联合查询有所帮助。
通过对HBM映射文件的理解、DAO层的连表查询实现以及查询结果的处理等几个方面进行了详细解释。在实际项目中,合理运用这些技巧可以极大地提高开发效率和代码质量。需要注意的是,在编写连表查询时要充分考虑性能问题...
本文将深入探讨Hibernate中的多表查询技术,解析其背后的原理与实践方法,帮助开发者更好地掌握这一核心技能。 ### Hibernate多表查询概述 在现实世界的应用场景中,数据往往不会孤立存在,而是通过关联分布在多个...
总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...
在Hibernate中,多表查询通常涉及到关联关系的映射,包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。通过这些关联,我们可以实现JOIN操作来获取多个表的数据。 1. 关联...
总之,Hibernate的多对多查询涉及实体类的定义、中间表的映射以及查询语句的编写。理解和熟练运用这些概念对于开发复杂的Java应用程序至关重要。在实际项目中,应根据业务需求灵活调整关联策略,确保数据的一致性和...
在本案例中,我们关注的是Hibernate中的多表查询,这是在处理复杂数据关系时常见的需求。 多表查询涉及到了三个或更多的表之间的关联,这在现实世界的业务场景中很常见,如学生信息与班级信息的关联。在Hibernate中...
本文将深入探讨如何通过配置优化Hibernate的多表查询,以提高应用的性能。 1. **联合查询优化**: 在进行多表查询时,Hibernate默认可能会生成多个单表查询,这会导致大量的数据库往返,降低效率。通过配置`@Join...
在Hibernate中,可以使用`Criteria` API或者`HQL`(Hibernate Query Language)来实现多表联查。`Criteria` API提供了更加面向对象的查询方式,通过`createCriteria()`方法指定主表,然后使用`createAlias()`方法...
本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多对多关联是数据库设计中的一种常见关系类型,指的是两个实体之间可以存在多个对应关系。例如,在学生与课程的关系中,一个学生可以选修多门...
总结,"Hibernate基于连接表的一对多单向关联"涉及到的主要知识点包括:数据库设计的一对多关系、Hibernate的实体映射、单向关联的配置、以及如何在Java代码中操作和查询这种关联。理解并熟练应用这些知识点,对于...
在Hibernate中,实现多对多关系需要通过关联表(也称为中间表或连接表)来完成。这个关联表通常包含两个外键,分别对应于两个参与关系的实体。以下是一个具体的步骤详解: 1. **定义实体类**:首先,为参与多对多...
标题中的“day36 04-Hibernate检索方式:多表连接查询”表明这是一个关于Hibernate框架的教程,重点讲解如何在Hibernate中进行多表连接查询。在这个主题中,我们将深入探讨Hibernate的ORM(对象关系映射)机制以及...
"Hibernate-基础联表模板"是针对Hibernate中联表查询的一个实用工具,旨在帮助开发者快速地进行多表关联查询,而不必记住复杂的SQL语句。 1. **Hibernate简介** Hibernate是一种开源的ORM框架,它允许开发者将Java...
Hibernate是Java领域的一个开源ORM框架,它简化了数据库操作,通过映射Java类到数据库表,可以将数据库操作转化为对Java对象的操作。Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 ...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
对于多表操作,Hibernate支持一对多、多对一、一对一和多对多等关联关系。通过注解或XML配置,可以定义表间的关联,例如`@ManyToOne`、`@OneToMany`、`@OneToOne`和`@ManyToMany`。在操作时,可以通过SessionFactory...
在多表映射中,Hibernate允许我们定义实体类之间的关系,如一对一、一对多、多对一和多对多关系。 在“一对多”关系中,一个实体可以对应多个其他实体。例如,一个部门可以有多个员工。在Hibernate中,我们通过在...
HQL是Hibernate的SQL方言,它是面向对象的查询语言,允许我们用类和对象的名字而不是表和列来写查询语句。HQL支持各种复杂的查询,如连接查询、分组查询、子查询等。例如,我们可以用以下HQL语句查询所有未删除的...