这次大创有个需求,在数据库建表时发现,用户表与项目表的关系表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//测试通过 List findByUserId(整数标识);//根据项目id,找出参与项目的所有UserProject//测试通过 List findByProjectId(整数projectId);//根据用户id和项目id找出所有的UserProject//测试通过 List findByUserIdAndProjectId(整数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 () { List userProjects=userProjectRepository.findByProjectId (1); (UserProject UserProject: userProjects) { System.out.println (userProject.toString ()); } } @Test 公共空间testFindByUserIdAndProjectId () { List userProjects=userProjectRepository.findByUserIdAndProjectId (1,1); (UserProject UserProject: userProjects) { System.out.println (userProject.toString ()); } } } 春天数据Jpa复合主键的实现