Spring Data JPA 联合主键

比如我们这里想要创建一张表,用于用户关注和粉丝。

relationship 两个字段,都是主键(即联合主键)

Spring Data JPA 联合主键

Spring Data JPA 实体如何设计才能自动创建这样的表呢?

仅仅使用两个 @Id 吗?

答案不是。

 

解决办法

 

实体

Relationship.java  实体

  1. package com.liuyanzhao.forum.entity;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.Id;
  5. import javax.persistence.IdClass;
  6. /**
  7.  * @author 言曌
  8.  * @date 2018/4/24 下午9:38
  9.  */
  10. @Entity
  11. @IdClass(RelationshipPK.class)
  12. public class Relationship {
  13.     private Long fromUserId;
  14.     private Long toUserId;
  15.     @Id
  16.     @Column(name = "from_user_id", nullable = false)
  17.     public Long getFromUserId() {
  18.         return fromUserId;
  19.     }
  20.     public void setFromUserId(Long fromUserId) {
  21.         this.fromUserId = fromUserId;
  22.     }
  23.     @Id
  24.     @Column(name = "to_user_id", nullable = false)
  25.     public Long getToUserId() {
  26.         return toUserId;
  27.     }
  28.     public void setToUserId(Long toUserId) {
  29.         this.toUserId = toUserId;
  30.     }
  31.     @Override
  32.     public boolean equals(Object o) {
  33.         if (this == o) return true;
  34.         if (o == null || getClass() != o.getClass()) return false;
  35.         Relationship that = (Relationship) o;
  36.         if (fromUserId != null ? !fromUserId.equals(that.fromUserId) : that.fromUserId != nullreturn false;
  37.         if (toUserId != null ? !toUserId.equals(that.toUserId) : that.toUserId != nullreturn false;
  38.         return true;
  39.     }
  40.     @Override
  41.     public int hashCode() {
  42.         int result = fromUserId != null ? fromUserId.hashCode() : 0;
  43.         result = 31 * result + (toUserId != null ? toUserId.hashCode() : 0);
  44.         return result;
  45.     }
  46. }

 

RelationshipPK.java  辅助

  1. package com.liuyanzhao.forum.entity;
  2. import javax.persistence.Column;
  3. import javax.persistence.Id;
  4. import java.io.Serializable;
  5. /**
  6.  * @author 言曌
  7.  * @date 2018/4/24 下午9:38
  8.  */
  9. public class RelationshipPK implements Serializable {
  10.     private Long fromUserId;
  11.     private Long toUserId;
  12.     @Column(name = "from_user_id", nullable = false)
  13.     @Id
  14.     public Long getFromUserId() {
  15.         return fromUserId;
  16.     }
  17.     public void setFromUserId(Long fromUserId) {
  18.         this.fromUserId = fromUserId;
  19.     }
  20.     @Column(name = "to_user_id", nullable = false)
  21.     @Id
  22.     public Long getToUserId() {
  23.         return toUserId;
  24.     }
  25.     public void setToUserId(Long toUserId) {
  26.         this.toUserId = toUserId;
  27.     }
  28.     @Override
  29.     public boolean equals(Object o) {
  30.         if (this == o) return true;
  31.         if (o == null || getClass() != o.getClass()) return false;
  32.         RelationshipPK that = (RelationshipPK) o;
  33.         if (fromUserId != null ? !fromUserId.equals(that.fromUserId) : that.fromUserId != nullreturn false;
  34.         if (toUserId != null ? !toUserId.equals(that.toUserId) : that.toUserId != nullreturn false;
  35.         return true;
  36.     }
  37.     @Override
  38.     public int hashCode() {
  39.         int result = fromUserId != null ? fromUserId.hashCode() : 0;
  40.         result = 31 * result + (toUserId != null ? toUserId.hashCode() : 0);
  41.         return result;
  42.     }
  43. }

 

启动项目,生成的数据表符合要求

Spring Data JPA 联合主键

 

 

二、获取数据

RelationshipRepository.java

  1. package com.liuyanzhao.forum.repository;
  2. import com.liuyanzhao.forum.entity.Relationship;
  3. import com.liuyanzhao.forum.entity.RelationshipPK;
  4. import org.springframework.data.jpa.repository.JpaRepository;
  5. import java.util.List;
  6. /**
  7.  * @author 言曌
  8.  * @date 2018/4/24 下午9:47
  9.  */
  10. public interface RelationshipRepository extends JpaRepository<Relationship, RelationshipPK> {
  11.     /**
  12.      * 根据关注者id查找所有记录(查找关注的人的id)
  13.      *
  14.      * @param fromUserId
  15.      * @return
  16.      */
  17.     List<Relationship> findByFromUserId(Long fromUserId);
  18.     /**
  19.      * 根据被关注者查找所有记录(查找粉丝的id)
  20.      *
  21.      * @param toUserId
  22.      * @return
  23.      */
  24.     List<Relationship> findByToUserId(Long toUserId);
  25.     /**
  26.      * 根据关注者和被关注者id查找某条记录
  27.      * @param fromUserId
  28.      * @param toUserId
  29.      * @return
  30.      */
  31.     Relationship findByFromUserIdAndToUserId(Long fromUserId, Long toUserId);
  32. }

 

三、测试类

  1. package com.liuyanzhao.forum.repository;
  2. import com.liuyanzhao.forum.entity.Relationship;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. import java.util.List;
  9. import static org.junit.Assert.*;
  10. /**
  11.  * @author 言曌
  12.  * @date 2018/4/24 下午9:56
  13.  */
  14. @SpringBootTest
  15. @RunWith(SpringRunner.class)
  16. public class RelationshipRepositoryTest {
  17.     @Autowired
  18.     private RelationshipRepository relationshipRepository;
  19.     @Test
  20.     public void save() {
  21.         relationshipRepository.save(new Relationship(1L,2L));
  22.         relationshipRepository.save(new Relationship(1L,3L));
  23.         relationshipRepository.save(new Relationship(1L,4L));
  24.         relationshipRepository.save(new Relationship(2L,3L));
  25.         relationshipRepository.save(new Relationship(2L,4L));
  26.         relationshipRepository.save(new Relationship(3L,4L));
  27.     }
  28.     @Test
  29.     public void findByFromUserId() throws Exception {
  30.         List<Relationship> relationshipList = relationshipRepository.findByFromUserId(1L);
  31.         System.out.println(relationshipList);
  32.     }
  33.     @Test
  34.     public void findByToUserId() throws Exception {
  35.         List<Relationship> relationshipList = relationshipRepository.findByToUserId(4L);
  36.         System.out.println(relationshipList);
  37.     }
  38.     @Test
  39.     public void findByFromUserIdAndToUserId() throws Exception {
  40.         Relationship relationship =  relationshipRepository.findByFromUserIdAndToUserId(1L,2L);
  41.         System.out.println();
  42.     }
  43. }

s

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
言曌

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: