zoukankan      html  css  js  c++  java
  • 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());
        }
    
  • 相关阅读:
    windows类型
    网络编程socket、udp
    mem族函数与str族函数(待填)
    位运算符的用处(待填)
    c51较c比较,单片机最小系统
    数据结构之 顺序栈的操作
    [置顶] 数据结构之 顺序栈的操作
    java中常用的帮助类。加快开发速度
    php实现安装程序的 安装
    php压缩文件帮助类
  • 原文地址:https://www.cnblogs.com/tengpengfei/p/10453953.html
Copyright © 2011-2022 走看看