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 @   旭好杂货铺  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示