如何设置JPA中实体间的映射


1.实体间映射关系的作用

给实体间设置映射关系后,就可以通过JPA或ORMapping框架的API,轻松的获得实体中复杂的属性(如:对象、对象集合),而不用自己写冗余重复的sql,同时框架还提供自动建表等功能。这样能减少差错率,提高开发效率,当然这只是ORMapping框架的好处之一,其他好处不再赘述。

2.实体间映射关系介绍

总的来说实体间映射关系有:一对一、一对多和多对多几种关系,细分起来他们又有单向和双向之分,下面来一一介绍.

3.各关系说明

To前面的代表本实体,To后面的代表另一实体

单双向的说明

术语介绍

4.实体间映射关系的使用

具体见:Hibernate,JPA对象关系映射之关联关系映射策略

小结

  1. 单向时,另一实体中不要声明本实体,且反端不配置注解 注意:用单向OneToMany时,ORMapping框架默认会使用中间表的方式来实现,但大多情况下,都希望使用外键实现,这时我们可以通过添加@JoinColumn注解来实现,例如:
//以Group - User 为例说明
Group{
  @OneToMany
  @JoinColum(name="group_id")//user中生成的数据库字段名
  public Set<User> getUser(){
  }
}
  1. 双向一对一时,根据业务判断出,被主要操作的一端(有时候两端差不多,那就随便加),在这端加上mappedBycascade = { CascadeType.ALL }, fetch = FetchType.LAZY,其中cascadefetch的值,根据实际情况来确定可参考
  2. 双向一对多关系时,集合上要写mappedBycascade = { CascadeType.ALL }, fetch = FetchType.LAZY,其中cascadefetch的值,根据实际情况来确定可参考,例如:
@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
}
  1. 双向多对多时,根据业务判断出,被主要操作的一端(有时候两端差不多,那就随便加),在这端加上mappedBy cascade = { CascadeType.ALL }, fetch = FetchType.LAZY,其中cascadefetch的值,根据实际情况来确定可参考

5.如何确定实体间的映射关系

根据业务的实际需要确定,简单来说,就是按两实体在各自实体中的声明来确定,具体方法间例子;千万不要根据业务对象之间的关系来确定,因为大部分时候,业务对象间的关系可以很灵活,多对一可以,多对多也对,只有业务需要才是根本。

例子:

  1. 你想在A实体里获得B实体,即在A实体中定义了一个B实体,那么就确定好了B实体A实体中的注解为@XToOne,
  2. X需要通过A实体B实体的定义来确定,
  3. 如果在B实体有一个A实体的集合属性,那么这个X就是Many,即B实体A实体中的注解为@ManyToOneA实体B实体中的注解为@OneToMany
  4. 如果在B实体有一个A实体属性,那么这个X就是One,即B实体A实体中的注解为@OneToOneA实体B实体中的注解为@OneToOne
  5. 如果在B实体没有A实体属性,那么这个X就既可以是One也可以是Many,即B实体A实体中的注解为@OneToOne@ManyToOne

例子有点绕,多推敲几遍就会领会了。

标题:如何设置JPA中实体间的映射
作者: Nova Woo 2014-09-11 
出处: http://novawoo.github.io/JPA-map
说明:转载、投稿、翻译类文章版权信息以正文标注为准
分类: blog    标签:
 
 

无觅相关文章插件,快速提升流量
友荐云推荐