1.实体间映射关系的作用
给实体间设置映射关系后,就可以通过JPA或ORMapping框架的API,轻松的获得实体中复杂的属性(如:对象、对象集合),而不用自己写冗余重复的sql,同时框架还提供自动建表等功能。这样能减少差错率,提高开发效率,当然这只是ORMapping框架的好处之一,其他好处不再赘述。
2.实体间映射关系介绍
总的来说实体间映射关系有:一对一、一对多和多对多几种关系,细分起来他们又有单向和双向之分,下面来一一介绍.
3.各关系说明
To
前面的代表本实体,To
后面的代表另一实体
- OneToOne:本实体中只有单个的另一个实体,另一实体中也只有单个的本实体
- OneToMany:本实体中有多个的另一个实体,另一实体中只有单个的本实体
- ManyToOne: 本实体中只有单个的另一个实体,另一实体中只有多个的本实体
- ManyToMany: 本实体中只有多个的另一个实体,另一实体中只有多个的本实体
单双向的说明
- 单向:表示可以从本实体获得另一实体,而另一实体却不能反向获得本实体
- 双向:表示关联的双方可以互相获得
术语介绍
- 关系的拥有端(发出端)
- 关系的反端(接收端),常见到
inverse
,就是指这一端
4.实体间映射关系的使用
具体见:Hibernate,JPA对象关系映射之关联关系映射策略
小结
- 单向时,另一实体中不要声明本实体,且反端不配置注解 注意:用单向OneToMany时,ORMapping框架默认会使用中间表的方式来实现,但大多情况下,都希望使用外键实现,这时我们可以通过添加@JoinColumn注解来实现,例如:
//以Group - User 为例说明 Group{ @OneToMany @JoinColum(name="group_id")//user中生成的数据库字段名 public Set<User> getUser(){ } }
- 双向一对一时,根据业务判断出,被主要操作的一端(有时候两端差不多,那就随便加),在这端加上
mappedBy
和cascade = { CascadeType.ALL }, fetch = FetchType.LAZY
,其中cascade
和fetch
的值,根据实际情况来确定可参考 - 双向一对多关系时,集合上要写
mappedBy
和cascade = { CascadeType.ALL }, fetch = FetchType.LAZY
,其中cascade
和fetch
的值,根据实际情况来确定可参考,例如:
@Entity public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private int age; @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy = "person1") private List<CellPhone> cellPhones; // Getters and Setters } @Entity public class CellPhone implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String manufacture; private String color; private Long phoneNo; @ManyToOne private Person person1; // Getters and Setters }
- 双向多对多时,根据业务判断出,被主要操作的一端(有时候两端差不多,那就随便加),在这端加上
mappedBy
cascade = { CascadeType.ALL }, fetch = FetchType.LAZY
,其中cascade
和fetch
的值,根据实际情况来确定可参考
5.如何确定实体间的映射关系
根据业务的实际需要确定,简单来说,就是按两实体在各自实体中的声明来确定,具体方法间例子;千万不要根据业务对象之间的关系来确定,因为大部分时候,业务对象间的关系可以很灵活,多对一可以,多对多也对,只有业务需要才是根本。
例子:
- 你想在
A实体
里获得B实体
,即在A实体
中定义了一个B实体
,那么就确定好了B实体
在A实体
中的注解为@XToOne
, X
需要通过A实体
在B实体
的定义来确定,- 如果在
B实体
有一个A实体
的集合属性,那么这个X
就是Many
,即B实体
在A实体
中的注解为@ManyToOne
,A实体
在B实体
中的注解为@OneToMany
, - 如果在
B实体
有一个A实体
属性,那么这个X
就是One
,即B实体
在A实体
中的注解为@OneToOne
,A实体
在B实体
中的注解为@OneToOne
, - 如果在
B实体
没有A实体
属性,那么这个X
就既可以是One
也可以是Many
,即B实体
在A实体
中的注解为@OneToOne
或@ManyToOne
例子有点绕,多推敲几遍就会领会了。