JPA复合主键的使用

背景

人员信息和组信息的关联表中使用的USER_ID_和GROUP_ID_的联合主键,在维护组人员信息的时候,发现JPA打印的SQL只根据USER_ID_作为条件来更新数据,当B组存在zhangsan时,A组插入zhangsan的时候,不会重新插入一条数据,而是将B组改为了A组,导致B组下没有zhangsan这个人员。

解决

JPA映射实体

@Entity
@Table(name = "xxx_id_membership")
@Data
@DynamicInsert
@DynamicUpdate
// IdClass()指定来定义复合主键的类
@IdClass(XxxIdMembershipPkEntity.class)
// 类必须实现序列化
public class XxxIdMembershipEntity implements Serializable {

    /**
     * 用户ID
     */
    @Id // 指定为ID主键
    @Column(name = "USER_ID_")
    private String userId;

    /**
     * 组ID
     */
    @Id // 指定为ID主键
    @Column(name = "GROUP_ID_")
    private String groupId;
}

复合主键定义类

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
// 类需要实现序列化
public class XxxIdMembershipPkEntity implements Serializable {
    /**
     * 用户ID
     */
    private String userId;

    /**
     * 组ID
     */
    private String groupId;
}

数据层定义

//ID 处为复合主键定义类
public interface XxxIdMembershipEntityRepository extends JpaRepository<XxxIdMembershipEntity, XxxIdMembershipPkEntity> {}
posted @ 2022-08-31 14:41  旭好杂货铺  阅读(64)  评论(0编辑  收藏  举报