美文网首页
hibernate映射----一对一关联映射

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

作者: Mango_lxh | 来源:发表于2018-09-09 20:41 被阅读0次

    一、映射类型

    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)

    • 需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person
    • 默认根据主键加载
    • 需要在idcard类中加入对Person类的引用
    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>
    

    相关文章

      网友评论

          本文标题:hibernate映射----一对一关联映射

          本文链接:https://www.haomeiwen.com/subject/rgvdgftx.html