一对对一关系的情况要多一些,不仅在POJO层体现为一对一的,还要保证数据库中的关系是一对一的,不允许出现一个表的两行记录共用另一个表中同一行记录的情况。这可以通过设置外键(关联的关系列)的唯一性约束(unique约束)来实现,也可以通过id(主键)的唯一性实现。
一对一的关系可以看作是一对多关系的特例。如果一对多关系的多方只有一个实体对象,那么这个关系就可看作是一对一的。因此一对一可以用类似于一对多的方式来配置。
以下通过设置外键唯一性来用舰船管理实现一个一对一映射的例子:
一个舰船(ship)上有若干个船员(Sailor)和一个船长(caption)。舰船与船员是一对多的关系,舰船与船长是一对一的关系。既有一对一、一对多又有多对一的关系。
Ship舰船实体类中包含四个属性:id主键、name船名、caption船长、sailors船员。其中ship与caption是一对一的关系,用@OneToOne来配置,它的外键列用@JoinColumn配置,注意unique属性要配置为true,利用数据库的unique约束保证一个船长不会被两艘舰船使用。Ship与sailors是一对多的关系,使用@OneToMany配置,用mappedBy=”ship”指定具体的配置在对方实体类中(也就是在Sailor的ship属性中)。
Ship.java
- 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
Sailor水手包括3个属性:id主键、name姓名、ship所在的船只。Ship是多对一属性,多个船员属于一艘船只,用@ManyToOne来配置,但实际上,ship属性也可以用@OneToOne来配置,从技术上讲,而这在配置上是相同的。用@JoinColumn配置外键(也就是两个表之间的关联键)。
Sailor.java
- 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
将两个实体类添加到hibernate配置文件中去:
hibernate.cfg.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19