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> {}
本文来自博客园,作者:旭好杂货铺,转载请注明原文链接:https://www.cnblogs.com/zhaoxu46/p/16643049.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~