一、基于主键的双向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的更多相关文章

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

    一.基于外键的双向1对1 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true&q ...

  2. Hibernate的映射文件中基于主键的双向1对1的关联

    1.Hibernate中采用基于主键的映射策略是,有一端(任意一端)的主键生成策略要是foreign,根据对方的主键来生成自己的主键,它的实体不能拥有自己的主键生成策略,如我的配置文件: <?x ...

  3. java之hibernate之基于主键的双向一对一关联映射

    这篇 基于主键的双向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构为: 2.类结构 Person.java public class Person implemen ...

  4. hibernate笔记--基于主键的单(双)向的一对一映射关系

    上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...

  5. [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Hibernate之基于主键映射的一对一关联关系

    1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ...

  7. Hibernate(九):基于主键映射的1-1关联关系

    背景: 在实际开发中我们会遇到新建一个用户表,但这个表字段过长,而且有写字段常用(主要),有些字段比较不常用(次要).此时,我们会考虑到把用户信息拆分到两张表中:member(存储用户主要信息),me ...

  8. hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

    基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...

  9. Hibernate关系映射(二) 基于外键的双向一对一

    基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...

随机推荐

  1. [LeetCode] Best Time to Buy and Sell Stock 6道合集【DP】

    1. Best Time to Buy and Sell Stock 2. Best Time to Buy and Sell Stock II 3. Best Time to Buy and Sel ...

  2. 替罪羊树&&非旋treap

    题解: 替罪羊树的模板和splay差距还是比较大的.. 按照我的splay的写法 真是都是问题.. 替罪羊树就是暴力的搞 当某颗子树大小大于这棵树的alpha时 就退出 另外删除的时候打懒标记删除 当 ...

  3. [转]利用ssh传输文件

    利用ssh传输文件 http://www.cnblogs.com/jiangyao/archive/2011/01/26/1945570.html 在linux下一般用scp这个命令来通过ssh传输文 ...

  4. centos 6.5升级内核到3.1

    1.查看本机内核版本 [root@localhost ~]# uname -r 2.6.32-358.el6.x86_64 2.安装含有内核软件的源 步骤一:导入证书 [root@localhost ...

  5. vue 常用手册

    基本使用 引入vue.js 创建Vue对象, 指定选项对象 el : 指定dom标签容器的选择器 data : 指定初始化状态属性数据的对象对象/函数(返回一个对象) 页面中 使用v-model: 实 ...

  6. HtmlTestRunner

    1.一般生成报告时,会使用时间来作为报告名称的一部分,引入time这个第三方,使用以下方式格式化当前时间 下面运行最终结果:2019-03-29-14_29_18------>年-月-日-时-分 ...

  7. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  8. 基于PySpark的网络服务异常检测系统 阶段总结(二)

    在上篇博文中介绍了网络服务异常检测的大概,本篇将详细介绍SVDD和Isolation Forest这两种算法 1. SVDD算法 SVDD的英文全称是Support Vector Data Descr ...

  9. jenkins创建svn项目自动部署

    Exec command ; cd /home/zhxjdk18/server/jenkins_project/owgd_site/admin; rm -rf * ; source .bashrc ; ...

  10. phpstorm自定义代码片段

    右上角file--settings--Editor--Live Templates---+