hibrnate教程10~一对一关系属性解析

创建两个实体类person和idcard

package cn.itcast.i_hbm_oneToOne;

/**
 * 身份证
 *
 * @author tyg
 *
 */
public class IdCard {
    private Integer id;
    private String number;

    private Person person; // 关联的公民

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "[IdCard:id=" + id + ", number=" + number + "]";
    }

}
 
 

IDcard

package cn.itcast.i_hbm_oneToOne;

/**
 * 公民
 *
 * @author tyg
 *
 */
public class Person {
    private Integer id;
    private String name;

    private IdCard idCard; // 关联的身份证

    public Integer getId() {
        return id;
    }

    public void setId(Integer 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;
    }

    @Override
    public String toString() {
        return "[Person:id=" + id + ", name=" + name + "]";
    }

}

IDcard的配置文件

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 package="cn.itcast.i_hbm_oneToOne2">

    <class name="IdCard" table="idCard2">
        <id name="id">
            <!-- 当使用基于主键的一对一映射时,
                有外键方的主键生成策略一定要是foreign。
                参数property:
                    生成主键值时所根据的对象。
             -->
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
        </id>
        <property name="number"/>

        <!-- person属性,Person类型。
            表达的是本类与Person的一对一。
            采用基于主键的一对一映射方式,本方有外键方。 -->
        <one-to-one name="person" class="Person" constrained="true"></one-to-one>

    </class>

</hibernate-mapping>

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 package="cn.itcast.i_hbm_oneToOne2">

    <class name="Person" table="person2">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"/>

        <!-- idCard属性,IdCard类型。
            表达的是本类与IdCard的一对一。
            采用基于主键的一对一映射方式,本方无外键方。
         -->
        <one-to-one name="idCard" class="IdCard"></one-to-one>


    </class>

</hibernate-mapping>

写测试类

package cn.itcast.i_hbm_oneToOne2;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App {

    private static SessionFactory sessionFactory = new Configuration()//
            .configure()//
            .addClass(Person.class)// 添加Hibernate实体类(加载对应的映射文件)
            .addClass(IdCard.class)// 添加Hibernate实体类(加载对应的映射文件)
            .buildSessionFactory();

    // 保存,有关联关系
    @Test
    public void testSave() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // 新建对象
        Person person = new Person();
        person.setName("张三");

        IdCard idCard = new IdCard();
        idCard.setNumber("100000011X");

        // 关联起来
        person.setIdCard(idCard);
        idCard.setPerson(person);

        // 保存
        session.save(person);
        session.save(idCard);

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    // 获取,可以获取到关联的对方
    @Test
    public void testGet() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // 获取一方,并显示另一方信息
        // Person person = (Person) session.get(Person.class, 1);
        // System.out.println(person);
        // System.out.println(person.getIdCard());

        IdCard idCard = (IdCard) session.get(IdCard.class, 1);
        System.out.println(idCard);
        System.out.println(idCard.getPerson());

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();

    }

    // 解除关联关系:使用基于主键的一对一映射方式:双方都不可以解除关联关系。
    @Test
    public void testRemoveRelation() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // 基于主键的一对一映射:从有外键方解除关系,不可以,因为主键 不能为null。
        IdCard idCard = (IdCard) session.get(IdCard.class, 1);
        idCard.setPerson(null);

        // // 基于主键的一对一映射:从无外键方解除关系,不可以。
        // Person person = (Person) session.get(Person.class, 1);
        // person.setIdCard(null);

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    // 删除对象,对关联对象的影响
    @Test
    public void testDelete() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // a, 如果没有关联的对方:能删除。
        // c, 如果有关联的对方:因为会直接执行删除自己,所以无外键方会有异常,有外键方没有异常。

        IdCard idCard = (IdCard) session.get(IdCard.class, 1);
        session.delete(idCard);

        // Person person = (Person) session.get(Person.class, 1);
        // session.delete(person);

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_41904221/article/details/80872634