在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两个实体,用于维护它们的多对多关系。
多对多关系映射的优点:
- 简单方便,通过注解定义双向关系。
- 实现多对多关系的持久化逻辑,避免直接操作关联表。
- 中介实体支持复杂的关联关系逻辑。