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

在JPA中可以通过@ManyToMany注解和中介实体实现多对多关系映射。

@ManyToMany注解:

  • 用于定义多对多关系,每个实体的对应属性会映射到连接表中。
  • 需要指定mappedBy或中间表来维护多对多关系。

示例:

@Entity 
public class User { 
    @Id 
    private int id;
    @ManyToMany
    private List<Role> roles;
}

@Entity
public class Role {
    @Id 
    private int id;
    @ManyToMany(mappedBy = "roles")
    private List<User> users;
} 

上例定义了User和Role的多对多关系,通过User的roles属性和Role的users属性映射到关联表中。
此时需要手动维护关联表数据,JPA会自动维护双向关系。

中间表:

  • 我们也可以直接定义中间表实体来维护多对多关系。
  • 中间表实体包含两个外键,指向两张关联表的主键。

示例:

@Entity 
@Table(name = "user_role")
public class UserRole {
    @EmbeddedId
    private UserRoleKey id;

    @ManyToOne
    @MapsId("userId")
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne 
    @MapsId("roleId")
    @JoinColumn(name = "role_id")
    private Role role;
}

@Embeddable
public class UserRoleKey implements Serializable {
  @Column(name = "user_id") 
  private int userId;

  @Column(name = "role_id")
  private int roleId;
} 

上例定义了UserRole作为中间表实体,包含UserRoleKey复合主键和外键指向User、Role两个实体,用于维护它们的多对多关系。

多对多关系映射的优点:

  1. 简单方便,通过注解定义双向关系。
  2. 实现多对多关系的持久化逻辑,避免直接操作关联表。
  3. 中介实体支持复杂的关联关系逻辑。