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;
    }
}

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;
    }

}

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();
    }

}

时间: 2024-10-22 08:11:58

Hibernate多表关系配置——一对一关系映射的相关文章

Configure One-to-One(配置一对一关系)【Code-First系列】

现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键[实际上是一对零或者一对一]. 请注意:一对一的关系,在MS SQL Server中,技术上是不可能实现的,主要还是一对零或者一对一的关系. 想了解更多的实体关系,请看MSDN,这里面讲解的很详细.----->>>Entity Relationship. 一.使用数据注解特性,来配置一对一(一对零)的关系. using System; using System.Collectio

0914 表与表之间的关系补充一对一关系 记录操作 关键字 多对多 子查询

1 表与表之间联系之一对一关系补充 生活中的一对一 客户表, 学员表   通过分析 一个客户只对应一个学员 一个学员只对应一个客户 所以确定关系为一对一 在mysql中通过外键来建立一对一 create table customer(id int primary key auto_increment,name char(10),phone char(11),sex char(1)); create table student(id int primary key auto_increment,n

hibernate由表生成持久化类和映射文件

Eclipse 由表生成持久化类和映射文件

【Hibernate步步为营】--双向关联一对一映射具体解释(一)

一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射的主对象中加入该标签,并将该对象的主键设置为foreign这样就实现了主键关联映射.讨论完了单向接下来讨论双向映射. 一.双向主键关联 双向的主键关联事实上是单向一对一主键关联的一种特殊情况.仅仅只是要在关联对象的两端的映射文件里都要进行<one-to-one>的配置.另外还要在主映射的主键一端採

NHibernate系列文章二十:NHibernate关系之一对一(附程序下载)

摘要 NHibernate一对一关系虽然不经常碰到,但是在对于数据库结构优化的时候,经常会碰到一对一关系.比如,产品详细信息比较多的时候,可以把产品详细信息放到另一张表里面,Product主表只记录产品主要信息.这样能够显著提高产品的查询效率. 这篇文章的附件:NHibernate Demo下载. 1.建立ProductDetail表 这里将ProductId设置为主键. Product和ProductDetail之间的关系. ProductId既是主键又是外键. 创建ProductDetail

hibernate中多表映射关系配置

1.one-to-many一对多关系的映射配置(在一的一方实体映射文件中配置) <!-- cascade属性:级联操作属性 save-update: 级联保存,保存客户时,级联保存客户关联的联系人 delete:级联删除,删除客户时,级联删除客户关联的联系人 all:级联保存+级联删除 --> <!-- inverse属性:设置是否不维护关联关系 true:不维护关联 false(默认值):维护关联 --> <!-- 一对多 --> <set name="

Hibernate一对一关系映射

Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别完成以下持久化操作 (1)保存员工档案的同时分配给员工一个账号 (2)加载员工档案的同时加载账号信息 一:按照外键映射 HibernateUtil工具类(用于获取session和关闭session) package cn.util; import org.hibernate.Session

Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set<String> address; private List<String> addressList = new ArrayList<String>(); //private Str

Hibernate学习(五)———— hibernate一对一关系映射详解

一.一对一关系的概述 一对一关系看起来简单,其实也挺复杂的.其中关系就包含了四种,单向双向和主键关联外键关联. 什么意思呢,也就是包含了单向一对一主键关联.双向一对一主键关联,单向一对一外键关联,双向一对一外键关联, 这四种中,单双向就不用在说了把,就是看你业务需求来去设置是否是单双向,而外键关联也很简单,前面的一对多和多对多度是依靠外键关联关系来写的.那主键关联关系是怎么样的呢?其实跟外键关联差不多,唯一的区别就是,让一个类的主键当作外键使用来指向另一个关联类的主键,从而两个类的主键就达到了同