hibernate映射----一对一关联映射

2018-09-09  本文已影响0人  Mango_lxh

一、映射类型

  1. 一对多(one-to-many)
  2. 多对一(many-to-one)
  3. 一对一(one-to-one)
  4. 多对多(many-to-many)

二、一对一关联

有两种策略可以实现一对一的关联映射
  1. 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
  2. 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;

1、一对一主键关联单向

两个对象之间是一对一的关系,如Person-IdCard

image.png
原理:

让两个实体对象的id保持相同
生成的t_person表的主键id 作为t_idcard表的外键
( t_person表的主码id 取自t_idcard表的主码)

IdCard类
public class IdCard {
    private int id;
    private String cardNo;
关联映射
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
Person类
public class Person {
    private int id; 
    private String name;
                private IdCard idCard
关联映射
<class name="com.hibernate.Person" table="t_person">
 <id name="id">
   <!-- person的主键来自于关联对象idCard  -->
<generator class="foreign" > 
   <param name="property">idCard</param>
   </generator> 
   </id>
   <property name="name"/> 
 <!-- one-to-one 标签的含义:hibernate根据主键加载关联对象idCard,
constrained=“true”表明当前主键上存在一个约束person的主键作为外键参照了idCard-->
<one-to-one name="idCard" constrained="true"/>
 </class>
生成的SQL语句如下:
create table t_idcard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
create table t_person (id integer not null, name varchar(255), primary key (id))
    alter table t_person add index FK785BED802591D1EF (id), add constraint FK785BED802591D1EF foreign key (id) references t_idcard (id)

2、一对一主键关联双向

hibernate一对一主键关联映射(双向关联Person<---->IdCard)

image.png
Person类
public class Person {
private int id;
private String name;
private IdCard idCard; 
. . . . . .
关联映射
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true"/>
</class>
IdCard类
public class IdCard {
private int id;
private String cardNo;
private Person person;
. . . . 
关联映射
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person"/>
</class>

3、一对一唯一外键关联单向

image.png

hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)
一对唯一外键关联映射是多对一关联映射的特例
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联

Person类
public class Person {
   private int id; 
   private String name;
               private IdCard idCard
关联映射
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
IdCard类
public class IdCard {
    private int id;
    private String cardNo;
关联映射
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>

4、一对一唯一外键关联双向

image.png

说明:
hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)
一对一唯一外键关联双向,需要在另一端idcard类中加入对Person的引用
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能指定主键(id)加载person(默认),而要根据person的外键(idCard)加载,所以采用如下映射方式:<one-to-one name="person" property-ref="idCard"/>

Person类

public class Person {
private int id;
private String name;
private IdCard idCard; 
 . . . . . .
映射文件
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
IdCard类
public class IdCard {
    private int id;
    private String cardNo;
    private Person person;
. . . . . .
映射文件
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" property-ref="idCard"/>
</class>
上一篇下一篇

猜你喜欢

热点阅读