JPA中如何实现一对多关系映射?

在JPA中可以通过@OneToMany注解和mappedBy属性实现一对多关系映射。

@OneToMany注解:

  • 用于定义一对多关系,该属性会映射到关联表中。
  • 需要指定mappedBy属性指向多的一端,以指定关系的维护端。

示例:

@Entity
public class User {
    @Id
    private int id; 
    @OneToMany(mappedBy = "user")
    private List<Address> addresses; 
}

@Entity
public class Address {
    @Id 
    private int id;
    @ManyToOne 
    private User user;
}

上例定义了User和Address的一对多关系,其中:

  • User的addresses属性配置了@OneToMany注解,mappedBy指向Address的user属性,指定Address维护这一关系。
  • 当对Address的user属性赋值或修改时,会自动更新User的addresses集合,实现双向关系维护。

这种映射方式的优点是:

  1. 简单方便,只需要配置注解即可。
  2. 避免手动维护关系,由JPA自动更新双向关系。
  3. 根据实际业务选择关系的维护端,更加灵活。

如果不指定mappedBy,还需要配置中间表来维护一对多关系,这种方式较为复杂。

一对多关系的查询:

  • 从一的一方查询多的一方,使用映射的属性直接获取集合。
  • 从多的一方查询一的一方,使用@ManyToOne注解定义的属性获取单个实体对象。

示例:

// 查询User及关联的Address集合  
User user = em.find(User.class, 1);  
List<Address> addresses = user.getAddresses(); 

// 查询Address及关联的User对象  
Address address = em.find(Address.class, 1);  
User user = address.getUser();