Hibernate11_映射关系---OneToOne双向

来源:互联网 发布:360 cn域名多少钱买的 编辑:程序博客网 时间:2024/06/06 00:05

OneToOne双向是在One2One单向基础上修改

1、IDCard不变

IDC实体类

package com.chb.model;public class IDCard {    private int id;    private String no;    private Person person;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getNo() {        return no;    }    public void setNo(String no) {        this.no = no;    }    public Person getPerson() {        return person;    }    public void setPerson(Person person) {        this.person = person;    }}

IDCard.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping        SYSTEM        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" ><!-- 映射对应的package --><hibernate-mapping package="com.chb.model">    <!-- 实体类IDCard与数据库中表t_id_card对应 -->    <class name="IDCard" table="t_id_card">        <id name="id" column="c_id">            <!-- 主键自增  -->            <generator class="native"></generator>        </id>        <property name="no" />        <!-- 外键关联使用manyToOne, 但是设置unique="ture", 限制为一对一的关系 -->        <many-to-one name="person" column="p_id" unique="true"></many-to-one>    </class></hibernate-mapping>

2、只需在Person类中添加IDCard对象, 在Person.hbm.xml中设置设置one-to-one关联, 设置property-ref=”person”表名有对端(IDCard)中的person对象维护关系

2.1、Person实体类

package com.chb.model;public class Person  {    private int id;    private String name;    private IDCard idCard;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public IDCard getIdCard() {        return idCard;    }    public void setIdCard(IDCard idCard) {        this.idCard = idCard;    }}

2.2、Person.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping        SYSTEM        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" ><!-- 映射对应的package --><hibernate-mapping package="com.chb.model">    <!-- 实体类Person与数据库中表person对应 -->    <class name="Person" table="t_person">        <id name="id" column="p_id">            <!-- 主键自增 -->            <generator class="native"></generator>        </id>        <property name="name" column="p_name"></property>        <!-- name 属性中IDCard对象的名称,property-ref="person"表名有对端(IDCard)中的person对象维护关系。  -->        <one-to-one name="idCard" property-ref="person"></one-to-one>    </class></hibernate-mapping>

3、测试

3.1、one2one双向添加测试。

package com.chb.model;import org.hibernate.Session;import com.chb.hbUtils.HibernateUtils;public class Test {    @org.junit.Test    public void test01() {        Session session = null;        //获取session        session = HibernateUtils.getSession();        //开启事务        session.beginTransaction();        //测试添加        IDCard idCard = new IDCard();        idCard.setNo("001");        session.save(idCard);        Person p = new Person();        p.setName("chb");        p.setIdCard(idCard);        session.save(p);        //提交事务        session.getTransaction().commit();        HibernateUtils.close();    }}

3.2、测试结果:是由IDCard端的person对象维护关系。所以通过p.setIdCard(idCard)就无效, 所以没有关联关系。

这里写图片描述

执行的sql

Hibernate:     create table t_id_card (       c_id integer not null auto_increment,        no varchar(255),        p_id integer,        primary key (c_id)    ) engine=InnoDBHibernate:     create table t_person (       p_id integer not null auto_increment,        p_name varchar(255),        primary key (p_id)    ) engine=InnoDBHibernate:     alter table t_id_card        drop index UK_3dn8d7nqti422123arcwiwcniHibernate:     alter table t_id_card        add constraint UK_3dn8d7nqti422123arcwiwcni unique (p_id)Hibernate:     alter table t_id_card        add constraint FKka2jsnojthq1ip58u1fqnlfwh        foreign key (p_id)        references t_person (p_id)Hibernate:     insert     into        t_id_card        (no, p_id)     values        (?, ?)Hibernate:     insert     into        t_person        (p_name)     values        (?)

4、先添加person, 在添加IDCard,

package com.chb.model;import org.hibernate.Session;import com.chb.hbUtils.HibernateUtils;public class Test {    @org.junit.Test    public void test01() {        Session session = null;        //获取session        session = HibernateUtils.getSession();        //开启事务        session.beginTransaction();        //测试添加        //先添加person        Person p = new Person();        p.setName("wx");        session.save(p);        //再添加IDCard        IDCard idCard = new IDCard();        idCard.setNo("002");        idCard.setPerson(p);        session.save(idCard);        //提交事务        session.getTransaction().commit();        HibernateUtils.close();    }}

结果:

这里写图片描述

5、load测试, 从person端获取

这里写图片描述

6、load测试, 从idCard端获取

这里写图片描述

7、最佳实践

这里写图片描述