hibernate之关于一对一单向,双向关联映射
【hibernate】之关于一对一单向,双向关联映射
首先我们来看,Hibernate官方对于一对一单向关联的解释:
基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的。
唯一的不同就是单向一对一关
联中的外键字段具有唯一性约束。
ok,那我们也能够这样理解,一对一事实上就是多对一关联的特殊形式,我们知道Hibernate的配置方式有两种,各自是Annotations,XML两种配置方式!
Annotations的一对一单向关联映射
人(User)和身 份 证号(Card)
@Entity
@Table(name="t_user")
publicclass User {
private Integer id;
private String name;
private Card card; @OneToOne
@JoinColumn(name="card_id",unique=true)//name是自己定义关联外键的列名
public Card getCard() {
returncard;
}
publicvoid setCard(Card card) {
this.card = card;
}
@Id
@GeneratedValue
public Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this.id = id;
} @Column(name="name")
public String getName() {
returnname;
}
publicvoid setName(Stringname) {
this.name = name;
}
@Entity
@Table(name="t_card")
publicclass Card {
private Integer id;
private String num; @Id
@GeneratedValue
public Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this.id = id;
}
@Column(name="card_id")
public String getNum() {
returnnum;
}
publicvoid setNum(Stringnum) {
this.num = num;
}
}
XML一对一单向关联
Person和Group,一个人仅仅能在一个组
publicclass Group {
private Integer id;
private String name;
public Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this.id = id;
}
public String getName() {
returnname;
}
publicvoid setName(Stringname) {
this.name = name;
}
}
publicclass Person {
private Integer id;
private String name;
private Integer age;
private Group group;
public Group getGroup() {
returngroup;
}
publicvoid setGroup(Groupgroup) {
this.group = group;
}
public Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(Stringname) {
this.name = name;
}
public Integer getAge() {
return age;
}
publicvoid setAge(Integer age){
this.age = age;
}
}
<?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 package="csg.hibernate.entity">
<class name="Group" table="t_group">
<id name="id">
<column name="id"/>
<generator class="native" />
</id>
<property name="name" />
</class>
</hibernate-mapping>
<? 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 package="csg.hibernate.entity">
<class name="Person" table="t_person">
<id name="id">
<column name="id"/>
<generator class="native" />
</id>
<property name="name" />
<property name="age" />
<many-to-one name="group" column="group_id" unique="true" not-null="true" />
</class>
</hibernate-mapping>
Ok,到这里,大家就有点疑惑,为什么我们的Annotaions配置採用的是one-to-one而我们的xml配置採用的是many-to-one呢?
当然XML配置是我參考Hibernate的文档而来,由于一对一本身就是多对一的特殊形式,
可是配置many-to-one又给我们一种暗示。多个***号相应一个人。所以Hibernate依据这样的情况提供unique唯一性来确认!
Annotations一对一双向关联映射
User和Card
@Entity
@Table(name="t_user")
publicclass User {
private Integer id;
private String name;
private Card card;
@OneToOne
@JoinColumn(name="card_id",unique=true)//name主要是自己定义关联外键的列名
public Card getCard() {
returncard;
}
publicvoid setCard(Cardcard) {
this.card = card;
}
@Id
@GeneratedValue
public Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this.id = id;
}
@Column(name="name")
public String getName() {
returnname;
}
publicvoid setName(Stringname) {
this.name = name;
}
}
@Entity
@Table(name="t_card")
publicclass Card {
private Integer id;
private String num;
private User user; @OneToOne(mappedBy="card")//mappedBy的意思是指定User中的card作为关联外键。否则User和Card都会出现外键
public User getUser() {
returnuser;
}
publicvoid setUser(Useruser) {
this.user = user;
}
@Id
@GeneratedValue
public Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this.id = id;
}
@Column(name="card_id")
public String getNum() {
returnnum;
}
publicvoid setNum(Stringnum) {
this.num = num;
}
}
Ok?那么我们能够看到在Annotaions中的配置都是ont-to-one,那么我们在xml中的配置呢?
<?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 package="csg.hibernate.entity">
<class name="Person" table="t_person">
<id name="id">
<column name="id"/>
<generator class="native" />
</id>
<property name="name" />
<property name="age" />
<many-to-one name="group" column="group_id" unique="true" not-null="true" />
</class>
</hibernate-mapping>
<? 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 package="csg.hibernate.entity">
<class name="Group" table="t_group">
<id name="id">
<column name="id"/>
<generator class="native" />
</id>
<property name="name" />
<!-- many-to-one这样的配置会分别在两个表中都产生外键,造成数据的多余,通常我们採用one-to-one的形式在xml中配置 -->
<many-to-one name="Person" column="person_id" unique="true" />
<!-- <one-to-onename="person"property-ref="group"/> -->
</class>
</hibernate-mapping>
ok,到这里一对一的单双向关联映射基本上就是这样。随笔之作,有问题。请留言!
hibernate之关于一对一单向,双向关联映射的更多相关文章
- (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)
上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...
- Hibernate一对一双向关联映射
关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...
- Hibernate从入门到精通(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...
- Hibernate(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...
- 【SSH系列】hibernate映射 -- 一对一双向关联映射
开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
- 010一对一 主键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- Hibernate从入门到精通(十一)多对多双向关联映射
上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...
随机推荐
- 实例化flask的参数及对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- define与typedef的区别
define: 发生在预处理阶段,也就是编译之前,仅仅文本替换,不做任何的类型检查 没有作用域的限制 typedef: 多用于简化复杂的类型声明,比如函数指针声明:typedef bool (*fun ...
- [转]Window2008站点安全设置,IIS7/IIS7.5中目录执行权限的设置方法
本文转自:http://blog.snsgou.com/post-510.html 最近帮一个朋友管理Window 2008服务器,发现有个站点是用asp写的,更可怕的是还有传说中的“上传漏洞”,在上 ...
- Django用户认证系统
一. 认证系统概要 create_user 创建用户 authenticate 验证登录 login 记住用户的登录状态 logout 退出登录 is_authenticated 判断用户是否登录 l ...
- html5——web字体
基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...
- Ubuntu无线转有线教程
本来想测试一下有线转无线的,奈何网卡不支持,所以就测试了一回无线转有线的测试!(真无聊,不过也算学习一下linux网桥的知识) ca0gu0@ub:~$ sudo brctl addbr br0 #添 ...
- Memcached 在Linux上的安装
1.安装libevent wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libeve ...
- 10java内存
java内存 1.栈---存储的是变量(不仅仅只有变量),不会对存储的内容进行赋值,存储的内容使用完成之后会立即进行清除 2.堆---存储的是对象.会对存储的内容进行赋值,存储内容使用完成之后会在某个 ...
- UGUI世界坐标转换为UI本地坐标(游戏Hud的实现)
实现世界坐标的原理是: 世界坐标和UGUI的坐标分属两个坐标系,他们之间是无法进行转换的,需要通过屏幕坐标系来进行转换(因为屏幕坐标是固定的),即先将游戏场景中的世界坐标通过游戏场景Camera转化为 ...
- 彩色MT9V034摄像头 Bayer转rgb FPGA实现
1 图像bayer格式介绍 bayer格式是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像.Bayer格式是相机内部的原始数据, 一般后缀 ...