- 浏览: 420227 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
zxjlwt:
学习了http://surenpi.com
java.lang.LinkageError解决办法。 -
zqb666kkk:
/**
*
* @param filepath
...
Java删除目录及目录下的所有文件 -
zqb666kkk:
f.exists() && f.isDirec ...
Java删除目录及目录下的所有文件 -
coldrain2014:
在线api文档 http://online.code1314. ...
JavaMail java.lang.NullPointerException -
timeroading1:
chxkyy 写道xx175194716 写道真佩服,把jar ...
Activiti 学习记录3 之Activiti源代码及默认h2数据库连接
问题:
在Hibernate中,我们经常会碰到多张表通过外键连接来查询表中的数据,需要用到<many-to-one></many-to-one>,<one-to-many></one-to-many>等连接,特别是表之间的连接多了,如果我们通过延迟加载,或立即加载的话。就要多发很多的sql查询语句。
例:
EcssFormula.hbm.xml:
xml 代码
- <class name="com.ecgit.ecss.data.EcssTFormula" table="ECSS_T_FORMULA" schema="ECCM">
- <id name="formulaid" type="java.lang.String">
- <column name="FORMULAID" length="50" />
- <generator class="uuid.hex" />
- id>
- <many-to-one name="ecssTFormulaRestrictByFp" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true">
- <column name="FP" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByFormularesultchildtype" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true">
- <column name="FORMULARESULTCHILDTYPE" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByTp" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true" >
- <column name="TP" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByPro" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true" >
- <column name="PRO" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByCl" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true" >
- <column name="CL" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByPer" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true">
- <column name="PER" length="50" />
- many-to-one>
- class>
EcssTFormulaRestrict.hbm.xml:
xml 代码
- <class name="com.ecgit.ecss.data.EcssTFormulaRestrict" table="ECSS_T_FORMULA_RESTRICT" schema="ECCM">
- <id name="restrictid" type="java.lang.String">
- <column name="RESTRICTID" length="50" />
- <generator class="uuid.hex" />
- id>
- <property name="appoint" type="java.lang.String">
- <column name="APPOINT" length="50" />
- property>
- <property name="isany" type="java.lang.String">
- <column name="ISANY" length="10" />
- property>
- <property name="exclude" type="java.lang.String">
- <column name="EXCLUDE" length="100" />
- property>
- <property name="limited" type="java.lang.String">
- <column name="LIMITED" length="100" />
- property>
- <property name="isnull" type="java.lang.String">
- <column name="ISNULL" length="10" />
- property>
- class>
ECSS_T_FORMULA与ECSS_T_FORMULA_RESTRICT表之间有六个多对一的连接。
因此如果我们不用外连接查询,要查询一个com.ecgit.ecss.data.EcssTFormula对象就要发送1+6(com.ecgit.ecss.data.EcssTFormulaRestrict)对象连接的语句。
在Hibernate 2中我们可以在<many-to-one></many-to-one>中用outer-join=true属性。
outer-join关键字有3个值,分别是true,false,auto,默认是auto。
- true: 表示使用外连接抓取关联的内容,这里的意思是当使用load(EcssTFormula.class,“id“)时,Hibernate只生成一条SQL语句将EcssTFormula与他的连接EcssTFormulaRestrict全部初始化。
- false:表示不使用外连接抓取关联的内容,当load(EcssTFormula.class,“id“)时,Hibernate生成两条SQL语句,一条查询EcssTFormula表,另5条查询EcssTFormulaRestrict表。这样的好处是可以设置延迟加载,此处要将EcssTFormulaRestrict类设置为lazy=true。
- auto:具体是ture还是false看hibernate.cfg.xml中的配置
注意:如果使用HQL查询OrderLineItem,如 from EcssTFormulao where o.id='id',总是不使用外部抓取,及outer-join失效
这样的话我们就不能通过外连接来查询了。
那么我们可以直接在HQL语句中用 left join 来强制实现外连接查询。
java 代码
- public List findByProperty(String propertyName, Object value)
- throws SorcererException {
- log.debug("finding EcssTFormula instance with property: "
- + propertyName + ", value: " + value);
- List list = new ArrayList();
- try {
- Session session = this.getSession();
- String queryString = "from EcssTFormula as formula left join formula.ecssTFormulaRestrictByFp , formula.ecssTFormulaRestrictByFormularesultchildtype" +
- " , formula.ecssTFormulaRestrictByTp , formula.ecssTFormulaRestrictByPro , formula.ecssTFormulaRestrictByPer , formula.ecssTFormulaRestrictByCl where formula."
- + propertyName + "=:"+propertyName;
- Query queryObject = session.createQuery(queryString);
- queryObject.setParameter(propertyName, value);
- List tempList = queryObject.list();
- for(int i=0;i
- list.add(((Object[])tempList.get(i))[0]);
- }
- log.debug("size:"+list.size());
- this.closeSessionIfNecessary(session);
- } catch (RuntimeException re) {
- log.error("find by property name failed", re);
- throw new SorcererException("获得公式失败", re);
- } catch (Exception e) {
- e.printStackTrace();
- throw new SorcererException("获得公式失败", e);
- }
- return list;
- }
tempList 中存放的是一个Object数组,Object[7],Object[0]为EcssTFormula的实例,后面的六个是EcssTFormulaRestrict的实例。这样查询的语句只是一个sql语句:
sql 代码
- Hibernate: select this.FORMULAID as FORMULAID6_, this.FP as FP6_, this.FORMULARE
- SULTCHILDTYPE as FORMULAR3_6_, this.TP as TP6_, this.PRO as PRO6_, this.CL as CL
- 6_, this.PER as PER6_, this.CALCULATEID as CALCULAT8_6_, this.FORMULANAME as FOR
- MULAN9_6_, this.FORMULATYPE as FORMULA10_6_, this.FORMULARESULTTYPE as FORMULA11
- _6_, this.FORMULAPRECISION as FORMULA12_6_, this.FORMULAMARKETDATE as FORMULA13_
- 6_, this.FORMULADATETYPE as FORMULA14_6_, this.DEFAULTVALUE as DEFAULT15_6_, thi
- s.ISCALCULATE as ISCALCU16_6_, this.ISSYSTEMFORMULA as ISSYSTE17_6_, this.ISCONT
- ACTID as ISCONTA18_6_, this.FORMULACONTENT as FORMULA19_6_, this.USERCONTENT as
- USERCON20_6_, ecsstformu1_.RESTRICTID as RESTRICTID0_, ecsstformu1_.APPOINT as A
- PPOINT0_, ecsstformu1_.ISANY as ISANY0_, ecsstformu1_.EXCLUDE as EXCLUDE0_, ecss
- tformu1_.LIMITED as LIMITED0_, ecsstformu1_.ISNULL as ISNULL0_, ecsstformu2_.RES
- TRICTID as RESTRICTID1_, ecsstformu2_.APPOINT as APPOINT1_, ecsstformu2_.ISANY a
- s ISANY1_, ecsstformu2_.EXCLUDE as EXCLUDE1_, ecsstformu2_.LIMITED as LIMITED1_,
- ecsstformu2_.ISNULL as ISNULL1_, ecsstformu3_.RESTRICTID as RESTRICTID2_, ecsst
- formu3_.APPOINT as APPOINT2_, ecsstformu3_.ISANY as ISANY2_, ecsstformu3_.EXCLUD
- E as EXCLUDE2_, ecsstformu3_.LIMITED as LIMITED2_, ecsstformu3_.ISNULL as ISNULL
- 2_, ecsstformu4_.RESTRICTID as RESTRICTID3_, ecsstformu4_.APPOINT as APPOINT3_,
- ecsstformu4_.ISANY as ISANY3_, ecsstformu4_.EXCLUDE as EXCLUDE3_, ecsstformu4_.L
- IMITED as LIMITED3_, ecsstformu4_.ISNULL as ISNULL3_, ecsstformu5_.RESTRICTID as
- RESTRICTID4_, ecsstformu5_.APPOINT as APPOINT4_, ecsstformu5_.ISANY as ISANY4_,
- ecsstformu5_.EXCLUDE as EXCLUDE4_, ecsstformu5_.LIMITED as LIMITED4_, ecsstform
- u5_.ISNULL as ISNULL4_, ecsstformu6_.RESTRICTID as RESTRICTID5_, ecsstformu6_.AP
- POINT as APPOINT5_, ecsstformu6_.ISANY as ISANY5_, ecsstformu6_.EXCLUDE as EXCLU
- DE5_, ecsstformu6_.LIMITED as LIMITED5_, ecsstformu6_.ISNULL as ISNULL5_ from EC
- CM.ECSS_T_FORMULA this, ECCM.ECSS_T_FORMULA_RESTRICT ecsstformu1_, ECCM.ECSS_T_F
- ORMULA_RESTRICT ecsstformu2_, ECCM.ECSS_T_FORMULA_RESTRICT ecsstformu3_, ECCM.EC
- SS_T_FORMULA_RESTRICT ecsstformu4_, ECCM.ECSS_T_FORMULA_RESTRICT ecsstformu5_, E
- CCM.ECSS_T_FORMULA_RESTRICT ecsstformu6_ where 1=1 and this.FP=ecsstformu1_.REST
- RICTID(+) and this.FORMULARESULTCHILDTYPE=ecsstformu2_.RESTRICTID(+) and this.TP
- =ecsstformu3_.RESTRICTID(+) and this.PRO=ecsstformu4_.RESTRICTID(+) and this.CL=
- ecsstformu5_.RESTRICTID(+) and this.PER=ecsstformu6_.RESTRICTID(+)
发表评论
-
是用枚举(enum)还是用常量(const)
2008-08-18 14:33 0In prior releases, the standard ... -
将java.sql.Blob对象存储成文件
2008-07-10 18:12 5051import java.io.BufferedInputStr ... -
java中的io系统总结
2008-07-09 13:34 2290java中的io中的(input/outp ... -
为什么 Java 接口中不允许定义变量
2008-06-27 18:51 7686转自:http://www.chixiang.or ... -
Java反射机制的小尝试
2008-06-24 12:35 1253com.mycompany.reflect.Reflect类: ... -
java.sql.BatchUpdateException: Overflow Exception
2008-06-11 14:44 11162http://forum.java.sun.com/threa ... -
MyEclipse EJB 3.0 Development Overview
2008-05-21 16:21 2593My Eclipse EJB 3.0 Development ... -
使用 Spring 2.5 注释驱动的 IoC 功能
2008-04-25 22:26 0[url]使用 Spring 2.5 注释驱动的 IoC 功能 ... -
JPA Best Practices
2008-04-16 15:59 3282JPA Best Practices [1] 转自 ... -
JavaMail java.lang.NullPointerException
2008-04-16 13:14 8912使用JavaMail发送邮件出现如下的错误: [ERROR,D ... -
eclipse下快速找类
2008-04-11 14:27 1906Ctrl+Shift+T ctrl+shift+O 自动加载 ... -
response.sendRedirect(location)与rd.forward()区别
2008-03-26 12:30 67613在Java Web开发中,经 ... -
Java删除目录及目录下的所有文件
2008-03-26 12:20 30620java中删除目录事先要删除目录下的文件或子目录public ... -
fileset用法
2008-03-10 09:54 6952FileSet FileSet是一个文件组.这些文件可在 ... -
Servlet/JSP版本之间的关系
2008-01-08 15:12 2503servlet:http://java.sun.com/pro ... -
总结:Svn自动属性设置
2007-12-28 14:59 5821问题提出: 我们在用svn管理代码时候,有时候我们需要 ... -
Spring 2 AOP编程问题
2007-12-18 16:01 1536spring 的aop功能怎么不起作用。 大家帮我看看: ja ... -
Tomcat 6.0下创建虚拟目录的几种方法
2007-12-11 13:27 9665%TOMCAT_HOME%\webapps\下直接创 ... -
eclipse 设置快捷键的地方
2007-12-10 15:03 1213[Window]->[Preferences]-> ... -
Tomcat下用IE下载*.rar文件出现乱码的解决方案
2007-12-10 10:32 3357问题: 在tomcat下直接下载*.rar 一 ...
相关推荐
内连接适用于只关注匹配数据的情况,而左外连接则在需要完整展示第一张表数据,即使第二张表无匹配数据时更为适用。 总之,掌握Hibernate中的内连接和左外连接是Java开发人员进行数据库操作的重要技能。通过理解和...
- 如果查询结果中包含多张表的数据,可以使用`setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)`将结果转换为Map,键为列名,值为对应列的值。 通过理解并掌握以上内容,开发者可以有效地利用Hibernate将...
8. **多态性支持**:Hibernate支持不同类型的对象与同一张表的映射,实现了数据库表的多态查询。 9. **实体关系映射(EJB3 JPA)**:Hibernate 3.2版本也支持Java Persistence API(JPA),提供了一种标准的方式来...
通过使用Hibernate,开发者可以避免编写大量的SQL语句,而是以面向对象的方式处理数据。它支持多种数据库,包括MySQL、Oracle、PostgreSQL等。 二、Hibernate核心概念 1. 实体(Entity):在Hibernate中,实体代表...
本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...
- 默认检索策略:不同关联类型有不同的默认策略,如多对一和一对一通常为外连接加载,一对多和多对多为立即加载。 - `load()`和`get()`的区别:load()支持延迟加载,若记录不存在则抛异常;get()找不到记录返回...
通过 Hibernate,开发者可以将 Java 对象映射到关系型数据库中的表,以及从数据库表中映射数据到 Java 对象,极大地简化了数据访问层的编程工作。 #### 二、版本介绍 - **版本号**:3.2 - **文档类型**:官方中文...
2. **新建数据源**:配置数据源以便于后续的数据库连接。 3. **添加Hibernate JAR包**:下载并添加必要的Hibernate库文件至项目的类路径中。 4. **反转生成实体类**:利用工具类根据数据库表结构自动生成对应的...
- HQL也支持JOIN查询,可以通过JOIN语法连接多个表。 4. **Hibernate最佳实践**: - 使用懒加载以减少内存消耗。 - 合理设计实体类及其映射文件。 - 充分利用Hibernate提供的功能和特性。 通过上述知识点的...
2. **配置与实体类**:在Hibernate中,开发者需要定义实体类来映射数据库表,并通过配置文件(如hibernate.cfg.xml)设置数据库连接信息。v5.2.13支持注解配置,使得实体类的定义更加直观。 3. **Session接口**:它...
在广告管理系统中,Spring用于管理组件间的依赖关系,如数据库连接、业务服务等,同时也作为其他框架的集成平台,如Struts2和Hibernate。 2. **Struts2框架**:Struts2是MVC设计模式的优秀实现,负责处理HTTP请求并...
在IT领域,特别是数据库操作与查询中,HQL(Hibernate Query Language)作为一种强大的查询语言,被广泛应用于基于Hibernate框架的数据访问层。HQL允许开发者使用类似SQL的语法进行数据库操作,但更贴近于面向对象的...
7. **HQL(Hibernate Query Language)相关配置**:Hibernate提供了自己的查询语言,与SQL类似但更面向对象,用于检索和操作数据。 在配置文件中,还可以添加连接池参数,如`hibernate.c3p0.*`,来优化数据库连接...
- 控制是否启用外连接查询。 - **二进制流** - 处理 BLOB 类型数据。 - **二级缓存和查询缓存** - 配置缓存策略提高性能。 - 示例: ```xml <property name="cache.provider_class">org.hibernate.cache....
本篇文档深入探讨了Hibernate的多个关键概念和技术细节,从创建注解项目到实体Bean的定义、再到复杂的关联关系映射、查询映射、验证器的使用以及与Lucene的集成,全面覆盖了开发者在使用Hibernate过程中可能遇到的...
Hibernate的配置文件(hibernate.cfg.xml)包含了数据库连接信息和实体类的映射。 2. **实体类(Entity)**:这些Java类代表数据库中的表,包含了属性和getter/setter方法。 3. **持久化层(DAO)**:Data Access ...