zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/zxd543/p/6693366.html
Copyright © 2011-2022 走看看