Hibernate关联关系映射之一对一关联关系
人和身份证之间就是一个典型的一对一关联关系。实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式
首先看他们的实体类
Person类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package entity;
public class Person {
private Integer id;
private String name ;
private IdCard idCard;
public Integer getId() {
return id;
}
public void setId( Integer id) {
this.id = id;
}
public String getName() {
return name ;
}
public void setName(String name ) {
this. name = name ;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
|
然后看IdCard类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package entity;
public class IdCard {
private Integer id;
private String number;
private Person person;
public Integer getId() {
return id;
}
public void setId( Integer id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
|
这里在Person类和IdCard类中分别有一个对方类型的属性。
然后看他们之间的关联关系映射,首先看Person.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?xml version= "1.0" encoding= "utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name = "entity.Person" table = "Person" schema = "MYHR" >
<id name = "id" type= "int" >
< column name = "ID" />
<generator class= "assigned" />
</id>
<property name = "name" type= "string" >
< column name = "NAME" not - null = "true" />
</property>
<! -- idCard属性,IdCard类型,表达本类与IdCard的一对一关联 -->
<! -- 采用基于外键的一对一,本方无外键方 -->
<! -- property-ref属性:对方映射中外键类对应的属性名 -->
<one- to -one name = "idCard" class= "entity.IdCard" property-ref= "person" >
</one- to -one>
</class>
</hibernate-mapping>
|
然后看一下IdCard.hbm.xml文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?xml version= "1.0" encoding= "utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name = "entity.IdCard" table = "IdCard" schema = "MYHR" >
<id name = "id" >
< column name = "ID" />
<generator class= "assigned" />
</id>
<property name = "number" >
< column name = "NAME" not - null = "true" />
</property>
<! -- person属性,Person类型,表示与Person类的一对一关联关系 -->
<! -- 采用基于外键的一对一关联方式,本方有外键 -->
<many- to -one name = "person" column = "personId" class= "entity.Person" unique = "true" ></many- to -one>
</class>
</hibernate-mapping>
|
这样Person和IdCard之间的一对一关联关系就搭建好了,然后看一下测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
package test;
import static org.junit.Assert.*;
import org.hibernate.Session;
import org.hibernate. Transaction ;
import entity.IdCard;
import entity.Person;
import factory.HibernateSessionFactory;
public class Test {
private Session session = null ;
private Transaction tran = null ;
@org.junit.Test
public void save() {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
try{
//新建对象
Person p = new Person();
p.setId(1);
p.setName( "张三" );
IdCard idCard = new IdCard();
idCard.setId(1);
idCard.setNumber( "10001" );
p.setIdCard(idCard);
idCard.setPerson(p);
session.save(p);
session.save(idCard);
tran. commit ();
}catch(Exception e){
tran. rollback ();
}
}
@org.junit.Test
public void Get() {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
try{
Person person = (Person) session.get(Person.class, 1);
IdCard idCard = person.getIdCard();
System. out .println(person.getName()+ "身份证号:" +idCard.getNumber());
tran. commit ();
}catch(Exception e){
tran. rollback ();
}
}
//解除关系
@org.junit.Test
public void RemoveRelation() {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
try{
//从有外键方接触关联关系可以,不可以从无外键方解除
IdCard idCard = (IdCard)session.get(IdCard.class, 1);
idCard.setPerson( null );
tran. commit ();
}catch(Exception e){
tran. rollback ();
}
}
//删除
@org.junit.Test
public void DeleteRelation() {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
try{
//如果没有关联对方,可以直接删除。
//如果有关联对方,且可以维护关联关系,他就会先删除关联关系,在删除自己。
//如果有关联关系,且不能维护关联关系,所以会执行删除自己,并且抛出异常。
IdCard idCard = (IdCard)session.get(IdCard.class, 1);
session. delete (idCard);
tran. commit ();
}catch(Exception e){
tran. rollback ();
}
}
}
|
这就是基于外键方式,基于主键的方式只需要在以上基础修改一下映射文件即可,下面分别看一下修改后的映射文件
首先看Person.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?xml version= "1.0" encoding= "utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package= "entity" >
<class name = "entity.Person" table = "Person" schema = "MYHR" >
<id name = "id" type= "int" >
< column name = "ID" />
<generator class= "assigned" />
</id>
<property name = "name" type= "string" >
< column name = "NAME" not - null = "true" />
</property>
<! -- idCard属性,IdCard类型,表达本类与IdCard的一对一关联 -->
<! -- 采用基于主键的一对一,本方无外键方 -->
<one- to -one name = "idCard" class= "entity.IdCard" />
</class>
</hibernate-mapping>
|
然后看IdCard.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?xml version= "1.0" encoding= "utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package= "entity" >
<class name = "entity.IdCard" table = "IdCard" schema = "MYHR" >
<id name = "id" type= "int" >
< column name = "ID" />
<! -- 当使用基于主键的一对一映射时,有外键方的主键生成策略是foreign, -->
<! -- 参数property:生成主键值时所根据的对象 -->
<generator class= "foreign" >
<param name = "property" >person</param>
</generator>
</id>
<property name = "number" type= "string" >
< column name = "NAME" not - null = "true" />
</property>
<! -- person属性,Person类型,表示与Person类的一对一关联关系 -->
<! -- 采用基于主键的一对一关联方式,本方有外键 -->
<one- to -one name = "person" class= "entity.Person"
constrained= "true" />
</class>
</hibernate-mapping>
|
转载于:https://www.cnblogs.com/LuckyBao/p/5926528.html
Hibernate关联关系映射之一对一关联关系相关推荐
- hibernate注释映射_Hibernate一对一映射示例注释
hibernate注释映射 Today we will look into One to One Mapping in Hibernate. We will look into Hibernate O ...
- Hibernate关联关系映射-----单向一对一映射配置
2019独角兽企业重金招聘Python工程师标准>>> 这里举了一夫一妻的例子. 实体: package uni.one2one;public class Husband {priv ...
- django orm级联_Django数据表关联关系映射(一对一、一对多、多对多)
我们知道涉及到数据表之间的对应关系就会想到一对一.一对多.多对多,在学习 MySQL 数据库时表关系设计是需要重点掌握的知识.Django 中定义了三种关系类型的字段用来描述数据库表的关联关系:一对多 ...
- hibernate关系映射(一对一)
一对一关联分为外键关联和主键关联:外键关联是指从表中存在主表的外键,这也是一种特殊的多对一关系:主键关联是指主从表的id一致 外键关联 主表:IDCard(校园卡) 从表:Student(学生) 学生 ...
- Hibernate关联关系映射实例速查
Hibernate关联关系映射实例速查 Hibernate的映射关系很多,也比较复杂,也很容易忘记.这个基本上占据了Hibernate学习的七成时间.熟悉这些映射模型,需要大量的实践才能掌握.下面是我 ...
- Hibernate 一对一关联关系
双向一对一关联关系: 域模型: 例如,部门只有一个部门经理,一个经理也只能管理一个部门.即,Department 中有一个Manager的引用,Manager 中又有一个Department 的引用. ...
- Hibernate 实体关联关系映射----总结
http://lavasoft.blog.51cto.com/62575/39398 Hibernate 实体关联关系映射----总结 花了三天的业余时间,终于写完了Hibernate关联关系映射的所 ...
- SSH:Hibernate框架(七种关联关系映射及配置详解)
概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...
- Hibernate实体关联关系映射
一.什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对 ...
最新文章
- 实现图片预览效果及模糊效果
- 巧用负载均衡 解决数据中心三大困惑
- 2017广东全国计算机12月,2018年广东考研时间:2017年12月23日至24日
- Bailian2912 三个完全平方数【进制+枚举】
- FormBorderStyle 枚举
- pytorch与resnet(六) 预训练模型使用的场景
- c语言图书信息管理系实验心得,C语言图书信息管理系统实验报告.doc
- c语言设计函数型号发生器,基于51单片机函数信号发生器
- idea json转对象(Java实体类)
- 关于js的match用法
- 北京邮电大学计算机导论试题,2020年秋季《北京邮电大学网络教育》各种考试题目汇总.docx...
- html图标隐藏,教你如何隐藏统计图标,两个隐藏统计图标的HTML代码
- 水表188协议测试软件,水表下行通信规约标准188协议-V1.5标准版.pdf
- SDTM submission - 如何处理split domain
- html自动轮播计时器不准,自己做的jQuery轮播图,大家帮忙看一下,能自动轮播,定时器,点击按钮不起用...
- centos 硬盘挂载
- npm和package是什么
- 【性能监控】TTI (Time to interactive)
- 便宜耐用学生蓝牙耳机哪款好?适合学生购买的蓝牙耳机推荐
- 基于SSH超市积分管理系统(附论文)