当前位置: 首页 > news >正文

JPA联合主键使用

在实际工作中,我们会经常遇到联合主键的情况,所以我用简单例子列举JPA两种实现联合主键的方式。

1、如何通过@IdClass 实现联合主键

第一步:新建一个UserInfoID类,里面是联合主键

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfoID implements Serializable {private String name, telephone;
}
​

第二步:新建一个UserInfo实体,采用@IdClass引用联合主键

@Entity
@Data
@Builder
@IdClass(UserInfoID.class)
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {private Integer ages;
​@Idprivate String name;@Idprivate String telephone;
}
​

第三步:新建一个UserInfoRepsitory类完成CRUD

@Repository
public interface UserInfoRepository  extends JpaRepository< UserInfo,UserInfoID> {
}
​

第四步:写一个测试

@SpringBootTest
class SpringDataJpaTestApplicationTests {
​
​@Resourceprivate UserInfoRepository userInfoRepository;
​@Testpublic void testIdClass() {userInfoRepository.save(UserInfo.builder().ages(29).name("sunfeng").telephone("18854885488").build());
​Optional<UserInfo> userInfoOptional = userInfoRepository.findById(UserInfoID.builder().name("sunfeng").telephone("18854885488").build());
​userInfoOptional.ifPresent(System.out::println);}
​
}
​

通过上面的例子可以发现表的主键是primary key(name, telephone),而Entity里面不是一个@Id字段了

2、@Embeddable与@EmbedDedId注解使用

第一步:我们在上面的例子中的UserInfoID里面添加@Embeddable注解

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class UserInfoID implements Serializable {private String name, telephone;
}
​

第二步:修改一下我们刚才的UserInfo对象,删除@IdClass添加 @EmbeddedId注解

@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {private Integer ages;
​@EmbeddedIdprivate UserInfoID userInfoID;}
​

第三部:其他不变我们修改一下测试用例

​
@SpringBootTest
class SpringDataJpaTestApplicationTests {
​
​@Resourceprivate UserInfoRepository userInfoRepository;
​@Testpublic void testIdClass() {userInfoRepository.save(UserInfo.builder().ages(29).userInfoID(UserInfoID.builder().name("sunfeng").telephone("18854885488").build()).build());
​Optional<UserInfo> userInfoOptional = userInfoRepository.findById(UserInfoID.builder().name("sunfeng").telephone("18854885488").build());
​userInfoOptional.ifPresent(System.out::println);}

运行完之后,可以得到相同的结果。那么两种方式之间的区别是什么?

  1. 在使用的时候 @EmbeddedId使用的是对象,而IdClass用的是具体的字段

  2. 二者的JPQL也会不一样

    1. @IdClass的JPQL写法是:SELECT u.name FROM UserIndo u

    2. @EmbeddedId的JPQL写法是:select u.userInfo.name FROM UserInfo u

相关文章:

  • Linux之J2EE的项目部署及发布
  • 飞天使-mysql8.0远程连接允许
  • 行业追踪,2023-10-27
  • 第八章 软件测试自动化
  • JavaScript进阶知识汇总~
  • c++复合数据类型
  • TeeChart for .NET 2023.10.19 Crack
  • Android 对于状态栏和导航栏的操作
  • Python之numpy数组学习(五)——广播
  • python实现PDF表格与文本分别导出EXCEL
  • 在本地模拟C/S,Socket套接字的使用
  • ChatGPT专业术语及有效使用方法概述
  • 城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研
  • java面试--线程总结
  • openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户
  • [PHP内核探索]PHP中的哈希表
  • bearychat的java client
  • If…else
  • Iterator 和 for...of 循环
  • Java 内存分配及垃圾回收机制初探
  • JavaScript DOM 10 - 滚动
  • oschina
  • PHP变量
  • socket.io+express实现聊天室的思考(三)
  • Swift 中的尾递归和蹦床
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 聚簇索引和非聚簇索引
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端相关框架总和
  • 嵌入式文件系统
  • 悄悄地说一个bug
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何选择开源的机器学习框架?
  • 使用SAX解析XML
  • 算法---两个栈实现一个队列
  • 算法-图和图算法
  • 延迟脚本的方式
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • $().each和$.each的区别
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ****Linux下Mysql的安装和配置
  • .Net Redis的秒杀Dome和异步执行
  • .net 使用ajax控件后如何调用前端脚本
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @DataRedisTest测试redis从未如此丝滑
  • @TableId注解详细介绍 mybaits 实体类主键注解