1)单向
单向指的是一方拥有另一方的引用(知道另一方),另一方并不拥有对方的引用(即反过来不知
道对方)
i.主键关联:
两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
例如:
(数据库结构图)
(对象模型)
ii.外键关联:
本来是用于多对一的配置,但是如果加上唯一的之后,也可以用来表示一对一关联关系
(数据库结构图)
(对象模型)
2)双向
双向关联,对于被拥有的对象(如这里的IdCard),只需要在实体类定义的时候加上mappedBy
即可。如下图:
Note:这里mappedBy的值一定要跟主对象(Person)的对应字段名称一致(private IdCard idCard)2.多对一(*)
1)单向
多对一的例子比如说User vs Group,对于“一”的那一端,实体定义并不需要特殊做什么,但对
于“多”的那一端,就需要拥有“一”的对象引用。
实际定义中,同一对一的主对象(拥有另一对象的引用的对象)定义方式完全一样,也是利用
@ManyToOne和@JoinColumn来注解,见下面的例子。
(对象模型)
注:
●Group、User由于与SQL语法保留字有冲突,应当通过@Entity定义给他们另赋一个表名
●Name在这里是作为组件出现的,参见7.组件映射部分
另,上面的例子,在保存的时候,必须先保存“一”的对象(即Group),然后保存“多”的对
象(即User),否则会报错。但可以通过设置Cascade属性来实现级联保存。
不过cascade也只不过帮我们编程省了些麻烦,但不可过度使用。
2)双向
跟一对一的双向映射一样,在被动的那一端(这里就是Group)使用@mappedBy
注:对于多对一、一对多的映射,通常都在“多”的那一端维护关系,如:
如果上图中,调换u1、g1的保存顺序,可以看到会多出一些不必要的SQL语句,大家可以自行
分析原因。
3.一对多(*)
一对多与多对一原理完全相同,只是站的角度不一样罢了。
1)单向
以上是班级vs学生的单向一对多映射示例,对于被动方的学生而言,不用特殊的标注。
2)双向
注意与上面的区别(此处改为mappedby而不是JoinColumn)
其实,双向一对多与上面双向多对一是完全一样的。
4.多对多
1)单向
由上图可知,单向多对多映射来说,主动方(User)需要加上@JoinTable来指定第三方关联表,被动方(Role)不需要进行任何修改。
joinColumns、inverseJoinColumns的含义,大家一看就能明白。
2)双向
可以看出,凡是需要双向关联的,都是在被动方通过设置mappedBy属性来达到目的。
5.集合映射
1)List
2)Set
默认
3)Map
不常用到
6.继承关系1)单表
2)多表
3)一张主表+多张子表7.组件映射
1)@Embedded
(对象模型)
2)@Embeddable