在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集合,实现双向关系维护。
这种映射方式的优点是:
- 简单方便,只需要配置注解即可。
- 避免手动维护关系,由JPA自动更新双向关系。
- 根据实际业务选择关系的维护端,更加灵活。
如果不指定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();