春天数据Jpa复合主键的实现

  


  

  

这次大创有个需求,在数据库建表时发现,用户表与项目表的关系表user_project的主键为复合主键:

        创建表user_project (   user_id INT (20),   project_id INT (20),   时间戳VARCHAR (50),   donate_money双(10,2),   主键(user_id project_id)   );   之前      

在网上看了几篇博客,以及在春天引导干货群咨询(感谢夜升额耐心解答)过后总算是做出来了。这里做个总结,方便日后查阅。

  


  

  

这里采用@IdClass注解的方式来实现复合主键;

  


  

  
      <李>编写一个复合主键类UserProjectMultiKeysClass;李   <李>通过@IdClass注释在实体中标注复合主键;李   <李>可以通过EntityManager获取数据,或者是直接在仓库里写方法;李   
  


  

  

复合主键类

        包com.hzy.Model;      进口java.io.Serializable;/* *   *由huangzhenyang>   包com.hzy.Model;      进口javax.persistence.Entity;   进口javax.persistence.Id;   进口javax.persistence.IdClass;   进口javax.persistence.Table;   进口java.io.Serializable;/* *   *由huangzhenyang,用户id=" + userId +   ”,projectId=" + projectId +   ”,时间戳=" +时间戳\“+ +”   '} ';   }   }      

注意:
  1. @IdClass标注用于标注实体所使用主键规则的类;
  2. 在实体中同时标注主键的属性,比如这段代码中的userId, projectId以及时间戳;

  

<强>获取数据
  

  

方法一:通过EntityManager获取,比如方法testUserProjectRepository ()
  

  

方法二:通过库获取;这里记得在扩展JpaRepository时把id的主键类指定为复合主键类UserProjectMultiKeysClass
  

        公共接口UserProjectRepository延伸JpaRepository {//根据用户Id,找出用户参与的所有UserProject//测试通过   ListfindByUserId(整数标识);//根据项目id,找出参与项目的所有UserProject//测试通过   ListfindByProjectId(整数projectId);//根据用户id和项目id找出所有的UserProject//测试通过   ListfindByUserIdAndProjectId(整数userId,整数projectId);   }      之前      

<强>单元测试的代码

        包com.hzy;      进口com.hzy.Model.UserProject;   进口com.hzy.Model.UserProjectMultiKeysClass;   进口com.hzy.Repository.UserProjectRepository;   进口com.hzy.Service.UserProjectService;   进口com.hzy.Service.UserService;   进口org.junit.Test;   进口org.junit.runner.RunWith;   进口org.springframework.beans.factory.annotation.Autowired;   进口org.springframework.boot.test.context.SpringBootTest;   进口org.springframework.test.context.junit4.SpringRunner;      进口javax.persistence.EntityManager;   进口javax.persistence.PersistenceContext;   进口javax.transaction.Transactional;   进口并不知道;/* *   *由huangzhenyang 2017/9/8。   */@RunWith (SpringRunner.class)   @SpringBootTest   公开课UserProejctRepositoryTest {   @ autowired   @PersistenceContext   私人EntityManager EntityManager;      @ autowired   私人UserProjectRepository UserProjectRepository;      @Test   公共空间testUserProjectRepository () {   UserProjectMultiKeysClass UserProjectMultiKeysClass=新UserProjectMultiKeysClass (1, 1,“2017-09-08”);   UserProject UserProject=entityManager.find (UserProject.class userProjectMultiKeysClass);   System.out.println (userProject.toString ());   }         @Test   公共空间testFindByUserId () {   ListuserProjects=userProjectRepository.findByUserId (1);   (UserProject UserProject: userProjects) {   System.out.println (userProject.toString ());   }   }      @Test   公共空间testFindByProjectId () {   ListuserProjects=userProjectRepository.findByProjectId (1);   (UserProject UserProject: userProjects) {   System.out.println (userProject.toString ());   }   }      @Test   公共空间testFindByUserIdAndProjectId () {   ListuserProjects=userProjectRepository.findByUserIdAndProjectId (1,1);   (UserProject UserProject: userProjects) {   System.out.println (userProject.toString ());   }   }   }

春天数据Jpa复合主键的实现