- 浏览: 364493 次
- 来自: 北京
文章分类
- 全部博客 (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入门 (二)用户实例
摘自圣思园 19.Hibernate的对象检索策略深度解析.avi 后半部分
一对一映射:
主键关联。
测试数据:
映射配置文件:
----测试代码:
存储代码:
运行结果:
查询代码:
运行查询代码的时候, hibernate会自动发出左外连接的SQL查询语句,如下:
Hibernate: select student0_.id as id1_4_1_, student0_.name as name2_4_1_, idcard1_.id as id1_1_0_, idcard1_.card_number as card2_1_0_ from test_student student0_ left outer join test_idcard idcard1_ on student0_.id=idcard1_.id where student0_.id=?
由于发出的是left outer join,此时的Student中所对应的IdCard对象也被赋值,如图所示:
====================关于一对一的延迟加载=============
在这里我们用的是get方法,Hibernate使用左外连接直接获取了Student所对应的IDCard。 但是如果我们想通过延迟加载来获取IDcard,那就必须在映射配置文件中做一些改动。
在主表Student中的<one-to-one>加入属性constrained="true",该属性默认值为false。
one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
此时执行代码如下:
-- 这里要注意的是IdCard映射文件应该配置延迟加载为true,当然Hibernate默认的延迟加载就是true。 所以不去配置也可以。 但是如果被配置成false,这里就不会实现延迟加载。
一对一映射:
主键关联。
测试数据:
public class Student { private String id; private String name; private IdCard idCard; } public class IdCard { private String id; private int number; private Student stu; } //不管是得到IdCard还是Student,都会得到相应的一对一关联的对象。
映射配置文件:
idcard.xml <hibernate-mapping package="com.lj.zhang.Student"> <class name="IdCard" table="test_idcard"> <id name="id" column="id"> <!-- foreign这里是用外联table的已经生成的主键 --> <generator class="foreign"> <!-- name=property是固定参数,表示用外联的student的id --> <param name="property">stu</param> </generator> </id> <!-- 注意这里column不能写成number,否则oracle会报错-- ORA-00904:标示符无效 --> <property name="number" column="card_number" type="integer"/> <one-to-one name="stu" class="com.lj.zhang.Student.Student"/> </class> </hibernate-mapping> student.xml <hibernate-mapping package="com.lj.zhang.Student"> <class name="Student" table="test_student"> <id name="id" column="id" type="string"> <generator class="uuid"> </generator> </id> <property name="name" column="name" type="string" /> <one-to-one name="idCard" class="IdCard" cascade="all" /> </class> </hibernate-mapping>
----测试代码:
存储代码:
Session session=HibernateUtil.openSession(); Student s=new Student("li",null); IdCard card=new IdCard(123,s); s.setIdCard(card); Transaction tx=session.beginTransaction(); session.save(s); tx.commit();
运行结果:
查询代码:
Session session=HibernateUtil.openSession(); Student s=(Student) session.get(Student.class, "4028bd81427560bc01427560c0120000"); System.out.println(s.getName()); System.out.println(s.getIdCard().getName());
运行查询代码的时候, hibernate会自动发出左外连接的SQL查询语句,如下:
Hibernate: select student0_.id as id1_4_1_, student0_.name as name2_4_1_, idcard1_.id as id1_1_0_, idcard1_.card_number as card2_1_0_ from test_student student0_ left outer join test_idcard idcard1_ on student0_.id=idcard1_.id where student0_.id=?
由于发出的是left outer join,此时的Student中所对应的IdCard对象也被赋值,如图所示:
====================关于一对一的延迟加载=============
在这里我们用的是get方法,Hibernate使用左外连接直接获取了Student所对应的IDCard。 但是如果我们想通过延迟加载来获取IDcard,那就必须在映射配置文件中做一些改动。
在主表Student中的<one-to-one>加入属性constrained="true",该属性默认值为false。
one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
此时执行代码如下:
Student s=(Student) session.load(Student.class, "4028bd814275cf19014275cf1c560000"); System.out.println(s.getName());//Hibernate: select student0_.id as id1_4_0_, student0_.name as name2_4_0_ from test_student student0_ where student0_.id=? li System.out.println(s.getIdCard().getNumber());//Hibernate: select idcard0_.id as id1_1_1_, idcard0_.card_number as card2_1_1_, student1_.id as id1_4_0_, student1_.name as name2_4_0_ from test_idcard idcard0_ left outer join test_student student1_ on idcard0_.id=student1_.id where idcard0_.id=? 123
-- 这里要注意的是IdCard映射文件应该配置延迟加载为true,当然Hibernate默认的延迟加载就是true。 所以不去配置也可以。 但是如果被配置成false,这里就不会实现延迟加载。
发表评论
-
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 2405这篇是关于如何配置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-21 17:41 556摘自圣思园Hibernate20.一 ... -
Hibernate的对象检索策略 (一) SQL左外连接检索策略
2013-11-20 15:32 1092首先是测试表的结构: 先通过hibernate将数据放入 ...
相关推荐
个人的很详细的Hibernate一对一映射配置详解,对初学者有帮助!
NULL 博文链接:https://lichaobao.iteye.com/blog/1977048
Hibernate双向一对一关联映射(注解版)
Hibernate配置详解,详细描述了Hibernate的配置文件,一对一 一对多,多对多的单双向配置详解。
hibernate中一对多和多对一的配置区别
详细讲解了hibernate 的多对一xml配置以及curd操作,讲解了级联操作,适合初学者学习
加入了hibernate框架的javaWeb项目,里面包含了一对多的典型配置
Hibernate一对多映射配置详解,很值得借鉴
一对一映射 hibernate优化配置一级二级缓存步骤 有图有真相
一个hibernate数据源的c3p0配置,希望对你有帮助
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用...
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
Hibernate 多表映射关系配置 如,一对一 多对一 多对多等
hibernate基本配置及使用方法,高手免看.
Hibernate配置各种数据源 <hibernate-configuration> <!– 各属性的配置–> <!—为true表示将Hibernate发送给数据库的sql显示出来 –> ”show_sql”>true <!– SQL方言,这边设定的是MySQL –> ”dialect”>...
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子
NULL 博文链接:https://profound-accumulation.iteye.com/blog/2243079
hibernate基于主外键的一对多/多对一关联
Hibernate关联关系配置,一对一,一对多,多对多,联合主键等的配置