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
  • 相关阅读:
    哲理故事
    ajaxToolkit发布之后出错!说未能加载文件或程序集!
    一个沉重的教训!!!
    ValidatorCallout真的是太酷了!
    GridView放在UpdatePanle里面模板列取值!
    Prototype学习笔记之-Ajax.Request
    数据分类重排!
    SQL SERVER 2005 sa登录失败!
    flex应该学到什么程度
    jquery dataTable的学习
  • 原文地址:https://www.cnblogs.com/zxd543/p/6693366.html
Copyright © 2011-2022 走看看