首页 > 代码库 > Hibernate多表关系配置——一对一关系映射

Hibernate多表关系配置——一对一关系映射

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

有两种策略可以实现一对一的关联映射

主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 唯一外键关联

外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;

1、实体对象

1.1 Person实体对象

技术分享
package demo.entity;
/**
 * 人实体
 * @author Don
 * @date:日期:2017年4月11日 时间:上午11:04:59*
 * @version 1.0
 */
public class Person {
    private String id;
    private String name;
    //一对一关系的实体表现
    private IdCard card;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public IdCard getCard() {
        return card;
    }
    public void setCard(IdCard card) {
        this.card = card;
    }
}
View Code

1.2 IdCard实体对象

技术分享
package demo.entity;
/**
 * 身份证实体
 * @author Don
 * @date:日期:2017年4月11日 时间:上午11:05:53*
 * @version 1.0
 */
public class IdCard {
    private String id;
    private String code;
    //一对一关系的实体表现
    private Person person;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String card) {
        this.code = card;
    }
    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }
    
}
View Code

2、一对一关系映射(主键关联)

2.1 Person对象映射配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 在这个一对一的关系中,Person可以自己产生主键值 -->
    <!-- name:实体, table:表名 -->
    <class name="demo.entity.Person" table="o2o_person">
        <!-- name:主键的名字,column:主键数据库表列,identity自增 -->
        <id name="Id">
            <!-- Hibernate使用generator类来生成主键 -->
            <generator class="uuid" />
        </id>
        <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
        <property name="name"  />
        
        <one-to-one name="card" class="demo.entity.IdCard" cascade="all"></one-to-one>
    </class>
</hibernate-mapping>

2.2 IdCard对象映射配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name:实体, table:表名 -->
    <class name="demo.entity.IdCard" table="02o_card">
        <!-- name:主键的名字,column:主键数据库表列,identity自增 -->
        <id name="Id">
            <!-- 主键关联,通过Person的主键生成IdCard的主键-->
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
        </id>
        <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
        <property name="code" />
        
        <one-to-one name="person" class="demo.entity.Person" cascade="all"></one-to-one>

    </class>
</hibernate-mapping>

3、一对一关系映射(唯一外键)

3.1 Person对象映射配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 在这个一对一的关系中,Person可以自己产生主键值 -->
    <!-- name:实体, table:表名 -->
    <class name="demo.entity.Person" table="o2o_person_forengn">
        <!-- name:主键的名字,column:主键数据库表列,identity自增 -->
        <id name="Id">
            <!-- Hibernate使用generator类来生成主键 -->
            <generator class="uuid" />
        </id>
        <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
        <property name="name"  />
        
        <!-- card中使用person描述Person对象 -->
        <one-to-one name="card" property-ref="person" cascade="all"></one-to-one>
    </class>
</hibernate-mapping>

 

3.2 IdCard对象映射配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name:实体, table:表名 -->
    <class name="demo.entity.IdCard" table="02o_card_forergn">
        <!-- name:主键的名字,column:主键数据库表列,identity自增 -->
        <id name="Id">
            <!-- 生成主键-->
            <generator class="uuid"></generator>
        </id>
        <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
        <property name="code" />
        
        <!-- IdCard添加外键,IdCard和Person具有多对一的关系,实现一对一,则限制unique为true -->
        <many-to-one name="person" column="personId" unique="true" cascade="all"></many-to-one>
    </class>
</hibernate-mapping>

 

4、测试保存

技术分享
package demo.test;

import org.hibernate.classic.Session;

import demo.entity.IdCard;
import demo.entity.Person;
import demo.util.HibernateUtil;

public class TestSave {

    public static void main(String[] args) {
        
        Session session =  HibernateUtil.getCurrentSession();
        session.beginTransaction();
        
        Person person = new Person();
        person.setName("张三");
        
        //身份证的主键Id依赖于Perrson,因此需要添加Person
        IdCard card = new IdCard();
        card.setCode("110");
        
        /*
         * 保存方式一
         * 
        card.setPerson(person);
        person.setCard(card);        
        session.save(person);
        */
        //方式二(IdCard是关系的维护方)
        card.setPerson(person);
        session.save(card);
        
        session.getTransaction().commit();
    }

}
View Code

 

Hibernate多表关系配置——一对一关系映射