ORM框架Hibernate (四) 一对一单向、双向关联映射
- 简介
- 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一、又如一夫一妻制等等。
- 记得在Java编程思想上第一句话是“一切皆对象”,生活中的所有事物都是对象,这种一一对应的关系也体现在了对象上,但是在对象上有了些区别这和对象的特性有关系,有了方向性,拿人和身份证来说他们是两个对象,如果是单一方向那么知道了人的信息就能知道身份证信息,相反却得不到。
- 从实现角度来分也可以分为两种情况,第一种是共享主键;第二种是唯一外键;这两种都很好理解,我们做的系统也不少了平时我们用的那种就是属于唯一外键约束,共享主键是那其中一个表的主键另一个表来用,两个表使用一个相同的主键来保持两个表中记录一一对应。
- 共享主键方式实现
- 在维持一对一映射中这种方式用的比较少,可能对于数据库的性能有所提高不需要外键来约束,我们拿人和身份证来说说这种方式怎么实现一对一映射,下面是这两个类的对应关系。
- 类图
- Person实体类
package com.bjpowernode.hibernate;
/**
* a person information
* @author LLS
*
*/
public class Person {
//class's properties
private int id;
private String name;
private Card card;
//getter and setter method
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- Card实体类
package com.bjpowernode.hibernate;
/**
* a identity card
* @author LLS
*
*/
public class Card {
//class properties
private int id;
private String cardNo;
//getter and setter method
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
} }
- Person映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<!-- 采用foregin策略,它会取得关联对象的标识 -->
<generator class="foreign">
<!-- property只关联对象 -->
<param name="property">card</param>
</generator>
</id>
<property name="name"></property>
<!--
one-to-one指示Hibernate如何加载其关联对象,默认根据主键加载,也就是拿到了关联字段
根据对端的主键来加载。
constrained="true"表示当前主键还是一个外键,也就是会生成外键约束语句,当前主键对引用表来说是一个
外键,但对当前表是主键
-->
<one-to-one name="card" constrained="true"></one-to-one> </class>
</hibernate-mapping>
- Card映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.bjpowernode.hibernate.Card" table="t_card">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo"></property>
</class>
</hibernate-mapping>
- 上面是从人到身份证的单向对应关系,如果想实现双向只需在Card类中加入对Person类的引用。另外每个代码中用到的重要属性都做了详细注释,可以参考注释看代码。
- 唯一外键约束
- 单向关联(从Person到Card)
- 还拿上面两个实体类举例代码基本同上面相同,上面已经写的很详细,不同的地方只是Person的映射文件有所区别,在里面加入了几个属性。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="native">
</generator>
</id>
<property name="name"></property>
<!--
这里面代码同上一篇博客,多对一映射代码相同,所不同的是加入了unique属性来限制只能是
一对一。
-->
<many-to-one name="card" column="cardId" unique="true"></many-to-one>
</class>
</hibernate-mapping>- 当你看到后是不是觉得和多对一映射关系很像呢,其实,它就是多对一的一种特殊情况也是就是多对一包括了一对一这种情况,我们通过加入了unique属性限制只能为一对一,多对一就成了一对一了。
- 双向关联
- 在Card实体以及映射文件中做了一些改动,如下:
- Card实体中加入了对Person的引用
package com.bjpowernode.hibernate; public class Card {
private int id;
private String cardNo;
//加入了对person对象的引用
private Person person; //…………………………同上
//…………………………同上
}- Card映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.bjpowernode.hibernate.Card" table="t_card">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo"></property>
<!-- PS -->
<!-- property-ref指定对应哪个表的列,如果不设置该属性则默认参照表的主键
在person表中的cardId列是参照Card表生成的,反过来,Card表必须也对应cardId列,
才能确保一对一关系,但是呢,默认情况会选择参照person表主键,所以,这里加入了property-ref
属性来限制一下,参照person表的哪个属性。
-->
<one-to-one name="person" property-ref="card"></one-to-one>
</class>
</hibernate-mapping>
- 单向关联(从Person到Card)
- 一对一关联是一种重要的对应关系,尤其是唯一外键约束必须理解和学会运用,在实际开发中这种对应关系可能会更复杂需要根据业务去分析,但原理都是一样的理解了这个对于别的也会轻松上手。
ORM框架Hibernate (四) 一对一单向、双向关联映射的更多相关文章
- java之hibernate之多对多双向关联映射
1.比如在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为: 2.类结构 Role.java public class Role implements Serializable{ priva ...
- (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)
上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...
- Hibernate一对一双向关联映射
关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...
- hibernate之关于一对一单向,双向关联映射
[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...
- Hibernate从入门到精通(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...
- Hibernate(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...
- 【SSH系列】hibernate映射 -- 一对一双向关联映射
开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
随机推荐
- Spring Boot简介
Spring Boot简介 Spring Boot是为了简化Spring开发而生,从Spring 3.x开始,Spring社区的发展方向就是弱化xml配置文件而加大注解的戏份.最近召开的SpringO ...
- 卡特兰数(Catalan)简介
Catalan序列是一个整数序列,其通项公式是 h(n)=C(2n,n)/(n+1) (n=0,1,2,...) 其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, ...
- phantompy — phantompy 0.10 documentation
phantompy - phantompy 0.10 documentation phantompy¶ Release v0.10. phantompy is a BSD Li ...
- jQ 操作积累
1.判断radio是否选中:方式一:var val=$('input:radio[name="sex"]:checked').val(); //(val==null 未选中) 方式 ...
- sql 和 nosql 说明
在传统的数据库中, 数据库的格式是由表(table).行(row).字段(field)组成的.表有固定的结构,规定了每行有哪些字段,在创建时被定义,之后修改很困难.行的格式是相同的,由若干个固定的字段 ...
- [C++参考]拷贝构造函数的参数必须是引用类型
在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识.在effective C++中说过这么一点:拷贝构造函数的参数必须是引用类型的.但是为什么呢? ...
- The Power of Reading——英语学习小技巧之七
This method is "The Power of Reading" and it comes from an article by Dr.Stephen Krashen. ...
- Android 开发技巧
1, ActionBar.setTitle() 的参数是 CharSequence,可以用SpannableString的,颜色字形随你
- phpcms v9附件上传后显示链接名称如何改为附件名称?
使用phpcms v9的朋友都知道,v9在后台添加内容的时候上传附件显示的是一个链接,这样太不人性化了,那怎么显示文件名称呢 ?小编以前发布文章的时候都是上传后复制链接在给文字加上超链接的,这样非常的 ...
- D1-Linux-CentOS学习打卡
从一月底开始萌生了想在继续学Python的时候,学一门新的操作系统. 在看很多程序员的JD时,很多都要求熟悉LINUX,并且奔方法里面也提到了在LINUX下的编程. ----------------- ...