Hibernate(11)_基于外键的双向1对1

一、基于外键的双向1对1

  • 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素增加unique=“true” 属性来表示为1-1关联
    另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段

1.实体类
部门类(Department .java)

public class Department {

    private Integer dId;
    private String dName;

    private Manager manager;
    //忽略getter和setter方法
    ...
}

管理者类(Manager .java)

public class Manager {

    private Integer mId;
    private String mName;

    private Department department;
    //忽略getter和setter方法
    ...
}

2.映射文件
Department.hbm.xml

    <!-- 基于外键的一对一映射,该映射与多对一实质相同,是多对一关联的一个特例,外键可以放到任意一端,
    在存放外键的一端使用<Many-to-one>元素,并在该元素中添加unique属性,且设置值true,表示多的一方也必须唯一
    在另一端使用<one-to-one>元素。
    -->
    <many-to-one name="manager" class="Manager" 
            column="M_ID" unique="true">
    </many-to-one>

Manager.hbm.xml

<!-- 没有外键的一端在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射
property-ref:指定使用被关联的实体主键以外的字段作为关联字段
-->
<one-to-one name="department"       
        class="com.withXml.bothOneToOne.entity.
withForeignKey.Department"
        property-ref="manager">
</one-to-one>

3.CRUD测试

    /**
     * 保存操作
     */
    @Test
    public void testOneToOneSave(){
        //新建部门对象
        Department department = new Department();
        department.setdName("财务部");

        //新建管理者对象
        Manager manager = new Manager();
        manager.setmName("张铭");


        //设定关联关系
        department.setManager(manager);
        manager.setDepartment(department);

        //执行保存,先保存没有外键列的对象,这样就会减少update语句,即先保存manage后保存department
        session.save(manager);
        session.save(department);

    }

    /**
     * 查询操作
     */
    @Test
    public void testOneToOneGet(){
        //默认情况下,对关联属性使用懒加载,所以会出现懒加载异常
        Department department = (Department) session.get(Department.class, 1);
        System.out.println(department.getdName());

        //出现懒加载异常
//      session.close();
//      Manager managerName = department.getManager();
        //无异常,仅仅是显示对象的类型
//      System.out.println(managerName.getClass());
        //有异常,使用到了对象的属性
//      System.out.println(managerName.getmName());

        //
        Manager managerName = department.getManager();
        System.out.println(managerName.getmName());
    }

    /**
     * 查询操作
     */
    @Test
    public void testOneToOneGet2(){
        //在查询没有外键的一端对象时,使用左外连接一并查出其关联的对象,并已经初始化
        Manager manager = (Manager) session.get(Manager.class, 1);
        System.out.println(manager.getmName());
    }
原文地址:https://www.cnblogs.com/tengpengfei/p/10453953.html