1、一对一关系
数据库中的一对一设计分两种形式:
(1) 外键关联:一个表中添加一个字段作为外键,值是与其相对应一对一关系表的主键值。
(2) 主键关联:两张一对一关系的表共用一个主键,主外键是一个字段。
在实体关系中
(1) 单向关联,在任意一个实体类中添加另一个实体类型的属性
(2) 双向关联,在两个实例类中都添加另一个实体类型的属性
映射文件的配置:
针对数据库一对一的第一种形式(外键关联):
单向关联:
主表映射文件不变
附表中使用<many-to-one>
<many-to-one name=" " class=" " column=" " unique="true"/>
name:主表名
class:主表实体类的完全路径
column:附表中外键字段名(取值为主表的主键值)
unique:值得唯一性,此处必须设置为true
双向关联:
主表中用<one-to-one>指定property-ref的值,附表中用<many-to-one>
主表:
<one-to-one name="" class=" " property-ref =" "/>
name:附表名
class:附表实体类的完全路径(例:com.baidu,domain.person)
property-ref:主表名
这个标签的含义是:name(附表)引用了property-ref(主表)的主键作为它的外键
附表:
<many-to-one name=" " class=" " column=" " unique="true"/>
name:主表名
class:主表实体类的完全路径
column:附表中外键字段名(取值为主表的主键值)
unique:值得唯一性,此处必须设置为true
针对数据库一对一的第二种形式(主键关联):
单向关联:
主表映射文件不变
附表中id属性generator的使用变化,<one-to-one>使用
附表:
<id name=""column="" >
<generator class=" foreign">
< param name="property">xxx</param>
</generator>
</id>
name:主表的主键名
column:附表的外键也是主键的名称
generator的class值改为foreign指定param的值为主表的表名称(xxx)
<one-to-onename="room" class="cn.zc.domain.Room" constrained="true"/>
name:附表实体类中主表实体类型的私有属性名
class: 主表实体类型属性的完全路径(例:com.baidu,domain.person)
constrained:必须是“true”,以告知hibernate当前表主键上存在一个约束:附表引用了主表的主键
双向关联:
主表使用<one-to-one>,附表附表中id属性generator的使用变化
主表:
<one-to-one name=”” classs=””/>
name:附表的实体类型即主表类型实体的私有属性值
class:附表实体类型属性的完全路径(例:com.baidu,domain.person)
附表:
<id name=""column="" >
<generator class=" foreign">
< paramname="property">xxx</param>
</generator>
</id>
name:主表的主键名
column:附表的外键也是主键的名称
generator的class值改为foreign指定param的值为主表的表名称(xxx)
2、多对一关系、一对多关系
数据库中一对多关系表现:
多的一方添加一个字段作为外键,字段的值是一的那一方的主键值。
在实体关系中:
(1) 单向关联:多的一方设置一个私有属性,该属性是一的那一方的引用
(2) 双向关联:在单向关联的基础上,一的那一方添加一个集合set,类型是多的一方的引用(set<多的一方类型>)
实体映射文件配置:
单向关联:
主表不变、附表使用<many-to-one>
<many-to-onename="sort" class="Sort" column="sort_id">
name:附表中主表类型引用名
class:主表实体类的完全路径(例:com.baidu,domain.person)
column:附表中外键字段名
双向关联:
主表使用<set>,附表使用<many-to-one>
主表:
<setname="items">
<keycolumn="orderid"></key>
<one-to-manyclass="Item"/>
</set>
name:set集合名
<key column="">column:
附表:
<many-to-onename="sort" class="Sort" column="sort_id">
name:附表中主表类型引用名
class:主表实体类的完全路径(例:com.baidu,domain.person)
column:附表中外键字段名
3、多对多关系
一般多对多关联会拆分成两个一对多的关系来实现多对多关系。
Hibernate的实现方式是通过中间表间接的实现了多对多关系,实际上也是将
多对多拆分成两个双向的一对多关系。
中间表是没有实体类的。
配置文件:
单向关联:
<set name="" table=" ">
<many-to-many class=""column=""/>
</set>
name:表一中私有属性表二实体类型对象
table:中间表名
<key column=""></key>
column:表一主键在中间表对应的字段名
<many-to-many class="" column=""/>
class:表二对应实体类
column:表二主键在中间表对应的字段名
双向关联:
表一:
<set name="" table=" ">
<key column=""></key>
<many-to-many class=""column=""/>
</set>
name:表一中私有属性表二实体类型对象
table:中间表名
<key column=""></key>
column:表一主键在中间表对应的字段名
<many-to-many class=""column=""/>
class:表二对应实体类
column:表二主键在中间表对应的字段名
表二:
<set name="" table=" ">
<key column=""></key>
<many-to-many class=""column=""/>
</set>
name:表二中私有属性表一实体类型对象
table:中间表名
<key column=""></key>
column:表一主键在中间表对应的字段名
<many-to-many class=""column=""/>
class:表一对应实体类
column:表一主键在中间表对应的字段名