本文以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(十一)--- 映射实体关联关系的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型

    Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...

  2. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  3. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

  4. 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题

    一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...

  5. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  6. 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置

    一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...

  7. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

  8. 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略

    本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...

  9. 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合

    一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...

随机推荐

  1. httpclient+Jsoup总结

    Jsoup.parse解析HTML字符串,如Jsoup.parse("<html><head><title>Firstparse</title> ...

  2. linux命令——mutt的安装和使用【转】

    linux命令--mutt的安装和使用[转] 首先介绍一下mutt这个软件,它是一款基于文字界面的邮件客户端,非常小巧,但功能强大,可以用它来读写,回复保存和删除你的邮件,能在linux命令行模式下收 ...

  3. 【转】关于Class.getResource和ClassLoader.getResource的路径问题

    Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...

  4. ACM/ICPC 之 平面几何-两直线关系(POJ 1269)

    题意:给定四点的坐标(x,y),分别确定两直线,求出其交点,若重合or平行则输出相应信息 用四个点的坐标算出直线通式(ax+by+c=0)中的a,b,c,然后利用a,b,c计算出交点坐标(其他公式不够 ...

  5. 记录linux系统用户shell终端操作记录

    在 /etc/profile 最后添加 export HISTTIMEFORMAT='[%F %T]: ' export PROMPT_COMMAND='{ msg=$(history 1 | { r ...

  6. Effective C++ -----条款35:考虑virtual函数以外的其他选择

    virtual函数的替代方案包括NVI手法及Strategy设计模式的多种手法.NVI手法自身是一个特殊形式的Template Method设计模式. 将机能从成员函数移到class外部函数,带来的一 ...

  7. Linux rpm 命令参数使用详解[介绍和应用]

    RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序” rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两 ...

  8. WCF错误:413 Request Entity Too Large

    在我们用WCF传输数据的时候,如果启用默认配置,传输的数据量过大,经常会出这个错误. WCF包含服务端与客户端,所以这个错误可能出现在服务端返回数据给客户端,或客户端传数据给服务端时. 1. 服务端返 ...

  9. Javascript调用C#后台方法及JSon解析

    Javascript调用C#后台方法及JSon解析   如何使用Ajax 调用C# 后台方法. 本文目录 如何使用Ajax 调用C# 后台方法. 1.后台(.cs)测试方法 2.前台调用(javasc ...

  10. 电脑不能浏览网页but能登录qq,解决方案总结

    电脑能登录qq,但是不能浏览网页,解决方法总结 [注]:仅供参考,属个人经验 今天早晨起来,电脑突然只能登录qq,不能上网了,从来没有遇到这种问题的我开始各种百度方法,各种尝试,最终成功解决了问题 首 ...