hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同
基于主键映射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关联关系的不同的更多相关文章
- day42——外键的限制和解决方法、外键的三种约束模式、修改表(单表查询)
day42 外键的限制和解决方法 可以添加外键关联的那个字段可以是 被唯一(unique)约束的字段 或者 主键 限制:+ 由于外键的使用,致使多个表之间产生了联系,当我们对这些表进行更新或删除操作的 ...
- Hibernate中的主键生成器generator
本文讲述Hibernate的generator属性的意义.Generator属性有7种class,本文简略描述了这7种class的意义和用法. [xhtml] view plaincopy <c ...
- 关于hibernate中映射中有many to one等外键关联时的问题
hibernate中的对象的3种状态的理解及导致报错object references an unsaved transient instance - save the transient insta ...
- Mysql 表约束 非空、唯一、主键、自增长、默认、外键约束(基础6)
非空(not null).唯一(unique key).主键(primary key).自增长(auto_increment).默认约束(default) 准备基础环境: mysql> crea ...
- Oracle根据主键获取对应表,Oracle根据外键获取相关表
Oracle根据主键获取对应表 select * from user_constraints a, USER_CONS_COLUMNS b where a.CONSTRAINT_TYPE = 'P' ...
- Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)
Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...
- hibernate中复合主键的使用
转: https://blog.csdn.net/shutingwang/article/details/6627730 https://blog.csdn.net/lmy86263/article/ ...
- Hibernate逍遥游记-第13章 映射实体关联关系-001用外键映射一对一(<many-to-one unique="true">、<one-to-one>)
1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...
- Hibernate(九):基于主键映射的1-1关联关系
背景: 在实际开发中我们会遇到新建一个用户表,但这个表字段过长,而且有写字段常用(主要),有些字段比较不常用(次要).此时,我们会考虑到把用户信息拆分到两张表中:member(存储用户主要信息),me ...
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...
随机推荐
- 先天性肾上腺增生症(ACH)
先天性肾上腺增生症 类型 症状 并发症 治疗 情感支持 产前筛查 预防 什么是先天性肾上腺皮质增生症? 先天性肾上腺增生症(CAH)是一组影响肾上腺的遗传性疾病.肾上腺产生激素皮质醇和醛固酮.CAH是 ...
- loj#2020. 「AHOI / HNOI2017」礼物
题意:给定xy数组求 \(\sum_{i=0}^{n-1}(x_i+y_{(i+k)\modn}+c)^2\) 题解:先化简可得 \(n*c^2+2*\sum_{i=0}^{n-1}x_i-y_i+\ ...
- oracle 基本操作--事务
事务:可以看做是由对数据可的若干操作组成的一个单元,浙西操作要么都完成,要么都取消,从而保证数据满足一致性的要求. 事务的组成: 一条或者多条DML 一条DDL 一条DCL DML语句需要使用comm ...
- 函数使用一:采购订单BAPI_PO_CREATE1
REPORT YTEST01. DATA:GS_POHEADER TYPE BAPIMEPOHEADER, GS_POHEADERX TYPE BAPIMEPOHEADERX, GT_RETURN T ...
- Alibaba Java Coding Guidelines
阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的<阿里巴巴Java开发规约>扫描插件!该插件由阿里巴巴P3C项目组研发.P3C是世界知名的反潜机,专门对付水下潜水艇,寓意是扫描出 ...
- Beta阶段——第3篇 Scrum 冲刺博客
Beta阶段--第3篇 Scrum 冲刺博客 标签:软件工程 一.站立式会议照片 二.每个人的工作 (有work item 的ID) 昨日已完成的工作 人员 工作 林羽晴 完成了报表数据的接口函数 顾 ...
- 使用IntelliJ IDEA 配置Maven(转)
原文地址:使用IntelliJ IDEA 配置Maven 1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配 ...
- 在js中if条件为null/undefined/0/NaN/""表达式时,统统被解释为false,此外均为true
Boolean 表达式 一个值为 true 或者 false 的表达式.如果需要,非 Boolean 表达式也可以被转换为 Boolean 值,但是要遵循下列规则: 所有的对象都被当作 true. 当 ...
- Java反序列化修复方案
1)下载与当前大版本相同的commons-collections包(原来是3.2.x就替换为3.2.2,原来是4.x就替换为4.4.1) 下载链接:http://commons.apache.org/ ...
- springmvc静态资源处理
1.配置springmvc拦截规则,注意不能拦截 /*,这样的话,会对所有请求默认拦截,而应该拦截 /, 这样servlet会先走默认的拦截规则,默认拦截规则找不到后,才会走 / 这个规则,这样静态资 ...