• JPA联合主键


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

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

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

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserInfoID implements Serializable {
        private String name, telephone;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    @Entity
    @Data
    @Builder
    @IdClass(UserInfoID.class)
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserInfo {
        private Integer ages;
    
        @Id
        private String name;
        @Id
        private String telephone;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    @Repository
    public interface UserInfoRepository  extends JpaRepository< UserInfo,UserInfoID> {
    }
    
    
    • 1
    • 2
    • 3
    • 4

    第四步:写一个测试

    @SpringBootTest
    class SpringDataJpaTestApplicationTests {
    
    
        @Resource
        private UserInfoRepository userInfoRepository;
    
    	@Test
    	public 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);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    通过上面的例子可以发现表的主键是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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    @Entity
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserInfo {
        private Integer ages;
    
        @EmbeddedId
        private UserInfoID userInfoID;
        
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    @SpringBootTest
    class SpringDataJpaTestApplicationTests {
    
    
        @Resource
        private UserInfoRepository userInfoRepository;
    
        @Test
        public 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    1. 在使用的时候 @EmbeddedId使用的是对象,而IdClass用的是具体的字段
    2. 二者的JPQL也会不一样
      1. @IdClass的JPQL写法是:SELECT u.name FROM UserIndo u
      2. @EmbeddedId的JPQL写法是:select u.userInfo.name FROM UserInfo u
  • 相关阅读:
    大数据(5q)ClickHouse客户端
    less和scss循环生成margin和padding
    公众号留言功能报价是多少?值得开通吗?
    Flink
    武汉星起航:亚马逊卖家如何做好产品的差异化工作?
    echarts+node+ajax实现时间天气服务器
    Django如何配置Redis,以及如何使用
    如何用Python写一个简单的查询q绑程序(v1.0)
    jQuery UI简单的讲解
    信奥要学哪些数学知识 学信奥要不要先学python
  • 原文地址:https://blog.csdn.net/qq_22494169/article/details/134097216