基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别

两个持久化类为Manager和Department

1:基于主键映射1-1关联关系

1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner

格式为:

<id name="departmentId" type="java.lang.Integer">
<column name="department_id"/>
<!--使用外键的方式来生成当前的主键-->
<generator class="foreign">
<param name="property">manager</param>
</generator>
里面有一个param元素,property属性指定使用当前持久化类的哪一个属性的主键作为外键

2)使用one-to-one元素映射关联属性且必须添加constrained="true"使当前的主键添加外键约束

完整的映射文件代码如下
Department.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
<class name="Department" table="department" >
<id name="departmentId" type="java.lang.Integer">
<column name="department_id"/>
<!--使用外键的方式来生成当前的主键-->
<generator class="foreign">
<!--property属性指定使用当前持久化类的哪一个属性的主键作为外键-->
<param name="property">manager</param>
</generator>
</id>
<property name="departmentName" type="java.lang.String">
<column name="department_name"/>
</property>
<!--
采用foreigner主键生成器策略的一端增加one-to-one元素映射关联属性,
其one-to-one属性还应增加constrained="true",以使当前的主键上添加外键约束
另一端增加
-->
<one-to-one name="manager" class="Manager" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
Manager.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
<class name="Manager" table="manager" >
<id name="managerId" type="java.lang.Integer">
<column name="manager_id"/>
<!--指定主键的生成方式, native:使用数据库本地方式-->
<generator class="native"/>
</id>
<property name="managerName" type="java.lang.String">
<column name="manager_name"/>
</property>
<!--映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射-->
<one-to-one name="department" class="Department"></one-to-one>
</class>
</hibernate-mapping>

2:基于外键映射1-1关联关系的不同

1)使用外键的实体类映射文件中使用many-to-one来映射1-1关联关系,且必须指定unique="true"

即一个部门只有一个经理,一个经理只有一个部门,每个部门对应的经理都是不一样的
<many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one>

2)没有外键的实体类使用one-to-one映射1-1关联关系,必须指定property-ref="被关联实体类的引用"来指定使用被关联实体主键以外的字段作为关联字段
<one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
完整的配置文件如下
Department.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
<class name="Department" table="department" >
<id name="departmentId" type="java.lang.Integer">
<column name="department_id"/>
<!--指定主键的生成方式, native:使用数据库本地方式-->
<generator class="native"/>
</id>
<property name="departmentName" type="java.lang.String">
<column name="department_name"/>
</property>
<!--使用many-to-one的方式来映射1-1关联关系-->
<many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one>
</class>
</hibernate-mapping>

Manager.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
<class name="Manager" table="manager" >
<id name="managerId" type="java.lang.Integer">
<column name="manager_id"/>
<!--指定主键的生成方式, native:使用数据库本地方式-->
<generator class="native"/>
</id>
<property name="managerName" type="java.lang.String">
<column name="manager_name"/>
</property>
<!--映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射-->
<!--没有外键的一端要使用one-to-one元素,该元素使用property-ref属性来指定使用被关联实体主键以外的字段作为关联字段-->
<one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
</class>
</hibernate-mapping>

 

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同的更多相关文章

  1. day42——外键的限制和解决方法、外键的三种约束模式、修改表(单表查询)

    day42 外键的限制和解决方法 可以添加外键关联的那个字段可以是 被唯一(unique)约束的字段 或者 主键 限制:+ 由于外键的使用,致使多个表之间产生了联系,当我们对这些表进行更新或删除操作的 ...

  2. Hibernate中的主键生成器generator

    本文讲述Hibernate的generator属性的意义.Generator属性有7种class,本文简略描述了这7种class的意义和用法. [xhtml] view plaincopy <c ...

  3. 关于hibernate中映射中有many to one等外键关联时的问题

    hibernate中的对象的3种状态的理解及导致报错object references an unsaved transient instance - save the transient insta ...

  4. Mysql 表约束 非空、唯一、主键、自增长、默认、外键约束(基础6)

    非空(not null).唯一(unique key).主键(primary key).自增长(auto_increment).默认约束(default) 准备基础环境: mysql> crea ...

  5. Oracle根据主键获取对应表,Oracle根据外键获取相关表

    Oracle根据主键获取对应表 select * from user_constraints a, USER_CONS_COLUMNS b where a.CONSTRAINT_TYPE = 'P' ...

  6. Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

    Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...

  7. hibernate中复合主键的使用

    转: https://blog.csdn.net/shutingwang/article/details/6627730 https://blog.csdn.net/lmy86263/article/ ...

  8. Hibernate逍遥游记-第13章 映射实体关联关系-001用外键映射一对一(<many-to-one unique="true">、<one-to-one>)

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...

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

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

  10. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

随机推荐

  1. CentOS7 下源代码安装php7

    安装PHP7: php-7.1.2.tar.gz:下载:wget http://cn2.php.net/get/php-7.1.2.tar.gz/from/this/mirror 安装php: # t ...

  2. Luffy之前端项目部署搭建

    1. 搭建前端项目 1.1 创建项目目录 cd 项目目录 vue init webpack lufei 根据需要在生成项目时,我们选择对应的选项, 效果: 根据上面的提示,我们已经把vue项目构建好了 ...

  3. python-flask-请求源码流程

    启动先执行manage.py 中的    app.run() class Flask(_PackageBoundObject): def run(self, host=None, port=None, ...

  4. 三大平衡树(Treap + Splay + SBT)总结+模板[转]

    Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...

  5. Boost.PropertyTree读取ini文件(Linux环境)

    昨天因为需要读取配置文件略略伤神.网上很多例子但是我用都会报错,很多人把Boost.PropertyTree的函数写很麻烦的包所以报错我也不知道什么问题,所以今天整理下. 头上附上官网链接:Boost ...

  6. windows安装weblogic并集成到eclipse

    1.下载 java是跨平台的,所以windows下载和linux一样的jar文件安装就行,当然也可以使用windows安装程序来安装. (weblogic下载不需要购买--oracle产品都是补丁和技 ...

  7. -L、-rpath和-rpath-link的区别

    链接器ld的选项有 -L,-rpath 和 -rpath-link,看了下 man ld,大致是这个意思: -L::  “链接”的时候去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L ...

  8. 【Loadrunner_WebService接口】对项目中的GetProduct接口生成性能脚本

    一.环境 https://xxx.xxx.svc?wsdl 用户名:username 密码:password 对其中的GetProduct接口进行测试 备注:GetProducts.xml文件内容和S ...

  9. java实现按中文首字母排序的方式

    public class ABD { public static void main(String[] args) { //Collator类是用来执行区分语言环境的String比较的,这里是选择CH ...

  10. UVALive 3401 - Colored Cubes 旋转 难度: 1

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...