Hibernate(12)_基于主键的双向1对1
一、基于主键的双向1对1 
1.介绍:
- 基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. - <param>子元素指定使用当前持久化类的哪个属性作为 “对方”
- 采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应增加 constrained=“true” 属性;另一端增加one-to-one元素映射关联属性。 
- constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键 
2.实体类 
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方法
    ...
}3.映射文件 
Department.hbm.xml
<hibernate-mapping package="com.withXml.bothOneToOne.entity.withPrimaryKey" auto-import="false">
    <class name="Department" table="BOTH_DEPARTMENTS_PRIMARY">
        <id name="dId" type="java.lang.Integer" access="field">
            <column name="D_ID" />
            <!-- 使用外键的方式来生成当前主键 -->
            <generator class="foreign" >
                <!-- property属性指定使用哪一个持久化类的那个属性的主键作为外键 -->
                <param name="property">manager</param>
            </generator>
        </id>
        <property name="dName" type="java.lang.String" access="field">
            <column name="D_NAME" />
        </property>
        <!--
            基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,
            自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的哪个属性作为 “对方”
            采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应
                        增加 constrained=“true” 属性;另一端增加one-to-one元素映射关联属性。
            constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象
        (“对方”)所对应的数据库表主键
         -->
        <one-to-one name="manager" class="Manager" constrained="true"></one-to-one>
    </class>
</hibernate-mapping>
Manager.hbm.xml
<hibernate-mapping package="com.withXml.bothOneToOne.entity.withPrimaryKey" auto-import="false">
    <class name="Manager" table="BOTH_MANAGERS_PRIMARY">
        <id name="mId" type="java.lang.Integer" access="field">
            <column name="M_ID" />
            <generator class="native" />
        </id>
        <property name="mName" type="java.lang.String" access="field">
            <column name="M_NAME" />
        </property>
        <one-to-one name="department" class="Department"></one-to-one>
    </class>
</hibernate-mapping>4.CRUD测试
/**
* 保存操作
 */
@Test
public void testOneToOneSave(){
    //新建部门对象
    Department department = new Department();
    department.setdName("财务部");
    //新建管理者对象
    Manager manager = new Manager();
    manager.setmName("张铭");
    //设定关联关系
    department.setManager(manager);
    manager.setDepartment(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());
}5.总结 
①实体类:双方各自添加对方实体类型的属性 
②映射文件:在其中一方的映射文件中主键的生成策略使用foreign,同时指定使用哪个一个持久化类的那个属性的主键作为外键 
详细如下:
<!-- 使用外键的方式来生成当前主键 -->
 <generator class="foreign" >
<!-- property属性指定使用哪一个持久化类的那个属性的主键作为外键 -->
    <param name="property">manager</param>
 </generator>
<!--
    基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,
    自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的哪个属性作为 “对方”
    采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应
                   增加 constrained=“true” 属性;另一端增加one-to-one元素映射关联属性。
constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象
(“对方”)所对应的数据库表主键
    -->
   <one-to-one name="manager" class="Manager"
        constrained="true">
   </one-to-one>另一端
<one-to-onename="department" class="Department">
</one-to-one>Hibernate(12)_基于主键的双向1对1的更多相关文章
- Hibernate(11)_基于外键的双向1对1
		一.基于外键的双向1对1 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true&q ... 
- Hibernate的映射文件中基于主键的双向1对1的关联
		1.Hibernate中采用基于主键的映射策略是,有一端(任意一端)的主键生成策略要是foreign,根据对方的主键来生成自己的主键,它的实体不能拥有自己的主键生成策略,如我的配置文件: <?x ... 
- java之hibernate之基于主键的双向一对一关联映射
		这篇 基于主键的双向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构为: 2.类结构 Person.java public class Person implemen ... 
- hibernate笔记--基于主键的单(双)向的一对一映射关系
		上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ... 
- [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现
		本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ... 
- Hibernate之基于主键映射的一对一关联关系
		1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ... 
- Hibernate(九):基于主键映射的1-1关联关系
		背景: 在实际开发中我们会遇到新建一个用户表,但这个表字段过长,而且有写字段常用(主要),有些字段比较不常用(次要).此时,我们会考虑到把用户信息拆分到两张表中:member(存储用户主要信息),me ... 
- hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同
		基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ... 
- Hibernate关系映射(二) 基于外键的双向一对一
		基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ... 
随机推荐
- git报错处理
			今天又遇到了这个问题,记录一下. 报错 原因及解决办法: 本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http ... 
- Redis的消息通知
			Redis的消息通知可以使用List类型的LPUSH和RPOP(左进右出),当然更方便的是直接使用Redis的Pub/Sub(发布/订阅)模式. 1.使用List实现队列 使用列表类型的LPUSH和R ... 
- spring的4种事务特性,5种隔离级别,7种传播行为
			spring事务: 事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (con ... 
- 【Maven】Select Dependency 无法检索
			问题: 在 “pom.xml” 中,点击 “Dependencies” -> “Add” 添加依赖时,无法检索. 如下图所示: 解决办法: 依次点击 “Windows”->“Show ... 
- makefile:n: *** missing separator. Stop
			makefile has a very stupid relation with tabs, all actions of every rule are identified by tabs .... ... 
- hibnet 自动生成表格
			在pom文件中添加相关的依赖 在application.yml文件中添加配置信息 新建实体类Boy 项目运行,mysql就产生了一个boy表. 需要注意的是:当配置文件ddl-auto: create ... 
- php图文合成文字居中(png图片合成)
			header('Content-type:text/html;charset=utf-8'); /** * png图文合成 by wangzhaobo * @param string $pic_pat ... 
- PHP算法排序之快速排序、冒泡排序、选择排序、插入排序性能对比
			<?php //冒泡排序 //原理:从倒数第一个数开始,相邻的两个数比较,后面比前面的小,则交换位置,一直到比较第一个数之后则最小的会排在第一位,以此类推 function bubble_sor ... 
- mysql解决数据库死锁问题
			为了保证数据的正确性,对数据库进行操作的时候都会进行上锁,也就是进行修改数据的时候同一时间只能有一个进程,当这个进程处理完了,释放锁了,其他进程才可以进行操作! 总是会碰见一些意外情况,导致数据库死锁 ... 
- P1118 [USACO06FEB]数字三角形`Backward Digit Su`…   回溯法
			有这么一个游戏: 写出一个11至NN的排列a_iai,然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少11,直到只剩下一个数字位置.下面是一 ... 
