攻城狮在路上(壹) Hibernate(十一)--- 映射实体关联关系
本文以Customer和Address类的关系为例说明一对一关联映射;以Category和Item类的关系说明多对多关联关系。
一、映射一对一关联:
分两种情况:按照外键映射和按照主键映射。这两种方式的区别在于对应表结构的不同。
1、按照外键映射:
实例代码:
Customer.hbm.xml:
<many-to-one name="homeAddress"
class="mypack.Address"
column="HOME_ADDRESS_ID"
cascade="all"
unique="true"/>
Address.hbm.xml:
<one-to-one name="customer"
class="mypack.Customer"
property-ref="homeAddress"/>
参数说明:
unique:该属性表明每个Customer对象都有唯一的homeAddress对象,可以表达这两个对象之间的一对一关联关系。
property-ref:建立了从homeAddress到Customer对象的关联。
其他说明:
所谓的按照外键映射,是指Customer类中建立了到Address的外键homeAddress,通过customer.homeAddress.id导航过去。
在Customer持久化类中,定义了一个Address对象。
2、按照主键映射:在项目中一般是使用这种配置方式。
实例代码:
Customer.hbm.xml:
<one-to-one name="address"
class="mypack.Address"
cascade="all" />
Address.hbm.xml:
<hibernate-mapping > <class name="mypack.Address" table="ADDRESSES" >
<id name="id" type="long" column="ID">
<generator class="foreign">
<param name="property">customer</param>
</generator>
</id>
...
<one-to-one name="customer"
class="mypack.Customer"
constrained="true"/>
</class>
</hibernate-mapping>
参数说明:
constrained属性设置为TRUE,表明Address表的id主键同时作为外键参照CUSTOMERS表。所以必须按上面的方式配置标识符生成策略。
二、映射单向多对多关联:
假定仅在Category类一端中定义了集合类型的items属性。可以使用<set><list><idbag><map>。
实例代码:
<set name="items" table="CATEGORY_ITEM"
lazy="true"
cascade="save-update">
<key column="CATEGORY_ID" />
<many-to-many class="mypack.Item" column="ITEM_ID" />
</set>
注意级联的配置即可。
三、映射双向多对多关联关系:
对于双向多对多关联关系,必须把其中一端的inverse属性设置为true。
inverse为true的一端可以使用:set\bag.
inverse为false的一端可以使用:set\list\idbag\map.
1、通用配置方式:
实例代码:
Category.hbm.xml:
<set name="items" table="CATEGORY_ITEM"
lazy="true"
cascade="save-update">
<key column="CATEGORY_ID" />
<many-to-many class="mypack.Item" column="ITEM_ID" />
</set>
Item.hbm.xml:
<set name="categories" table="CATEGORY_ITEM"
lazy="true"
inverse="true"
cascade="save-update">
<key column="ITEM_ID" />
<many-to-many class="mypack.Category" column="CATEGORY_ID" />
</set>
2、把多对多关联分解为两个一对多关联:最近的项目中使用的是该方式。
实例代码:
Item.hbm.xml:
<set name="lineItems" lazy="true" inverse="true" cascade="save-update">
<key column="ITEM_ID" />
<one-to-many class="mypack.LineItem" />
</set>
Order.hbm.xml:
<set name="lineItems" lazy="true" inverse="true" cascade="save-update">
<key column="ORDER_ID" />
<one-to-many class="mypack.LineItem" />
</set>
LineItem.hbm.xml:
<many-to-one name="order" column="ORDER_ID" class="mypack.Order" not-null="true" />
<many-to-one name="item" column="ITEM_ID" class="mypack.Item" not-null="true" />
此种方式需要为中间表建立一个持久化类。
攻城狮在路上(壹) Hibernate(十一)--- 映射实体关联关系的更多相关文章
- 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型
Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...
- 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)
Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...
- 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存
一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...
- 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题
一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...
- 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务
一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...
- 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置
一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...
- 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)
本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...
- 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略
本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...
- 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合
一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...
随机推荐
- 表单验证神器——jquery.validate插件
jquery.validate.js插件应用举例,ajax方式提交数据. html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- 跨域解决方案二:使用JSONP实现跨域
跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家 ...
- django formset bug?
碰到了一个郁闷的问题,修改inlineformset时,全部删掉子表,再新增一行时,报错. 背景: 用django配合jq做动态表格,实现用js动态添加/删除行,并通过inlineformset更新到 ...
- EOS单向N对1关联
1. N端实体中用于关联的属性可以是主键也可以是非主键,1端的关联字段必须是主键(可以是单主键也可以是复合主键). 如下图关联字段:orgid 2.当在N端选择了用于关联的属性,那么这些属性在N端实体 ...
- 如何准确高效的获取数据库新插入数据的主键id
例如我们新建了一张表UserInformation,字段如下Id,为主键,自增,其它字段Name,Pwd,Email 然后我们来执行一个新增插入操作: insert into UserInformat ...
- React JS快速入门教程
翻译至官方文档<Tutorial>http://facebook.github.io/react/docs/tutorial.html 转载请注明出处:http://blog.csdn.n ...
- poj 1182
http://poj.org/problem?id=1182 一个利用并查集的经典题目. 思路:在网上看到别人的思路,觉得方法还是挺不错的. 首先,开辟一个3*n的数组belg,用来存b和c的关系,在 ...
- ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)
两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...
- SAP打印出库单需求
*&---------------------------------------------------------------------* *& Report Z_SD_CKD ...
- codeforces 496A. Minimum Difficulty 解题报告
题目链接:http://codeforces.com/contest/496/problem/A 题目意思:给出有 n 个数的序列,然后通过删除除了第一个数和最后一个数的任意一个位置的数,求出删除这个 ...