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
}
- 双向多对多时,根据业务判断出,被主要操作的一端(有时候两端差不多,那就随便加),在这端加上
mappedBycascade = { 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
例子有点绕,多推敲几遍就会领会了。