最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn)

 更新時(shí)間:2019年04月12日 11:37:21   作者:冬天飲雪水  
這篇文章主要介紹了Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

這次大創(chuàng)有個(gè)需求,在數(shù)據(jù)庫建表時(shí)發(fā)現(xiàn),user表與project表的關(guān)系表 user_project的主鍵為復(fù)合主鍵:

CREATE TABLE user_project(
 user_id      INT(20),
 project_id     INT(20),
 timestamp     VARCHAR (50),
 donate_money    DOUBLE(10,2),
 PRIMARY KEY (user_id,project_id)
);

在網(wǎng)上看了幾篇博客,以及在spring boot干貨群咨詢(感謝夜升額耐心解答)過后總算是做出來了。這里做個(gè)總結(jié),方便日后查閱。

正文

這里采用@IdClass注解的方式來實(shí)現(xiàn)復(fù)合主鍵;

思路

  1. 編寫一個(gè)復(fù)合主鍵類UserProjectMultiKeysClass;
  2. 通過@IdClass注釋在實(shí)體中標(biāo)注復(fù)合主鍵;
  3. 可以通過EntityManager獲取數(shù)據(jù),或者是直接在Repository 里寫方法;

實(shí)現(xiàn)

復(fù)合主鍵類

package com.hzy.Model;

import java.io.Serializable;

/**
 * Created by huangzhenyang on 2017/9/7.
 * UserProject的復(fù)合主鍵類
 *
 * @Param userId
 * @Param projectId
 * @Param timestamp
 * 由這三個(gè)共同組成復(fù)合主鍵
 */
public class UserProjectMultiKeysClass implements Serializable {
  private Integer userId;
  private Integer projectId;
  private String timestamp;

  //Constructor
  public UserProjectMultiKeysClass() {
  }

  public UserProjectMultiKeysClass(Integer userId, Integer projectId, String timestamp) {
    this.userId = userId;
    this.projectId = projectId;
    this.timestamp = timestamp;
  }

  //Setter and Getter
  public Integer getUserId() {
    return userId;
  }

  public void setUserId(Integer userId) {
    this.userId = userId;
  }

  public Integer getProjectId() {
    return projectId;
  }

  public void setProjectId(Integer projectId) {
    this.projectId = projectId;
  }

  public String getTimestamp() {
    return timestamp;
  }

  public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;
  }

  // ***重寫hashCode與equals方法*** 劃重點(diǎn)!
  @Override
  public int hashCode() {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + ((userId == null) ? 0 : userId.hashCode());
    result = PRIME * result + ((projectId == null) ? 0 : projectId.hashCode());
    result = PRIME * result + ((timestamp == null) ? 0 : timestamp.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj){
    if(this == obj){
      return true;
    }
    if(obj == null){
      return false;
    }
    if(getClass() != obj.getClass()){
      return false;
    }

    final UserProjectMultiKeysClass other = (UserProjectMultiKeysClass)obj;
    if(userId == null){
      if(other.userId != null){
        return false;
      }
    }else if(!userId.equals(other.userId)){
      return false;
    }
    if(projectId == null){
      if(other.projectId != null){
        return false;
      }
    }else if(!projectId.equals(other.projectId)){
      return false;
    }
    if(timestamp == null){
      if(other.timestamp != null){
        return false;
      }
    }else if(!timestamp.equals(other.timestamp)){
      return false;
    }

    return true;
  }
}

注意:

復(fù)合主鍵類必須滿足:
1. 實(shí)現(xiàn)Serializable接口;
2. 有默認(rèn)的public無參數(shù)的構(gòu)造方法;
3. 重寫equals和hashCode方法。equals方法用于判斷兩個(gè)對(duì)象是否相同,EntityManger通過find方法來查找Entity時(shí),是根據(jù)equals的返回值來判斷的。hashCode方法返回當(dāng)前對(duì)象的哈希碼;

實(shí)體類

package com.hzy.Model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import java.io.Serializable;

/**
 * Created by huangzhenyang on 2017/9/7.
 * 
 */
@Entity
@Table(name = "user_project")
@IdClass(UserProjectMultiKeysClass.class)
public class UserProject implements Serializable {
  private double donateMoney;
  private Integer userId;
  private Integer projectId;
  private String timestamp;

  @Id
  public Integer getUserId(){
    return this.userId;
  }

  @Id
  public Integer getProjectId(){
    return this.projectId;
  }

  @Id
  public String getTimestamp(){
    return this.timestamp;
  }

  //getter and setter
  public double getDonateMoney() {
    return donateMoney;
  }

  public void setDonateMoney(double donateMoney) {
    this.donateMoney = donateMoney;
  }

  public void setUserId(Integer userId) {
    this.userId = userId;
  }

  public void setProjectId(Integer projectId) {
    this.projectId = projectId;
  }

  public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;
  }

  @Override
  public String toString() {
    return "UserProject{" +
        "donateMoney=" + donateMoney +
        ", userId=" + userId +
        ", projectId=" + projectId +
        ", timestamp='" + timestamp + '\'' +
        '}';
  }
}

注意:
1. @IdClass標(biāo)注用于標(biāo)注實(shí)體所使用主鍵規(guī)則的類;
2. 在實(shí)體中同時(shí)標(biāo)注主鍵的屬性,比如這段代碼中的userId,projectId以及timestamp ;

獲取數(shù)據(jù)

方法一: 通過EntityManager獲取,比如方法testUserProjectRepository()

方法二:通過Repository獲取;這里記得在extends JpaRepository<UserProject,UserProjectMultiKeysClass>時(shí)把id的主鍵類指定為復(fù)合主鍵類UserProjectMultiKeysClass

public interface UserProjectRepository extends JpaRepository<UserProject,UserProjectMultiKeysClass>{
  // 根據(jù)用戶Id,找出用戶參與的所有UserProject
  // TEST PASS
  List<UserProject> findByUserId(Integer userId);

  // 根據(jù)項(xiàng)目id,找出參與項(xiàng)目的所有UserProject
  // TEST PASS
  List<UserProject> findByProjectId(Integer projectId);

  // 根據(jù)用戶id和項(xiàng)目id 找出所有的UserProject
  // TEST PASS
  List<UserProject> findByUserIdAndProjectId(Integer userId,Integer projectId);
}

單元測(cè)試的代碼

package com.hzy;

import com.hzy.Model.UserProject;
import com.hzy.Model.UserProjectMultiKeysClass;
import com.hzy.Repository.UserProjectRepository;
import com.hzy.Service.UserProjectService;
import com.hzy.Service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;
import java.util.List;

/**
 * Created by huangzhenyang on 2017/9/8.
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserProejctRepositoryTest {
  @Autowired
  @PersistenceContext
  private EntityManager entityManager;

  @Autowired
  private UserProjectRepository userProjectRepository;

  @Test
  public void testUserProjectRepository(){
    UserProjectMultiKeysClass userProjectMultiKeysClass =
        new UserProjectMultiKeysClass(1, 1, "2017-09-08");
    UserProject userProject = entityManager.find(UserProject.class,userProjectMultiKeysClass);
    System.out.println(userProject.toString());
  }


  @Test
  public void testFindByUserId(){
    List<UserProject> userProjects = userProjectRepository.findByUserId(1);
    for(UserProject userProject:userProjects){
      System.out.println(userProject.toString());
    }
  }

  @Test
  public void testFindByProjectId(){
    List<UserProject> userProjects = userProjectRepository.findByProjectId(1);
    for(UserProject userProject:userProjects){
      System.out.println(userProject.toString());
    }
  }

  @Test
  public void testFindByUserIdAndProjectId(){
    List<UserProject> userProjects = userProjectRepository.findByUserIdAndProjectId(1,1);
    for(UserProject userProject:userProjects){
      System.out.println(userProject.toString());
    }
  }
}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中MVC模式與三層架構(gòu)

    java中MVC模式與三層架構(gòu)

    這篇文章主要讓我們理解MVC模式和三層架構(gòu)的基礎(chǔ)知識(shí),有興趣的同學(xué)可以閱讀,借鑒參考一下
    2023-03-03
  • Java 大小寫最快轉(zhuǎn)換方式實(shí)例代碼

    Java 大小寫最快轉(zhuǎn)換方式實(shí)例代碼

    這篇文章主要介紹了Java 大小寫最快轉(zhuǎn)換方式實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 百度翻譯API使用詳細(xì)教程(前端vue+后端springboot)

    百度翻譯API使用詳細(xì)教程(前端vue+后端springboot)

    這篇文章主要給大家介紹了關(guān)于百度翻譯API使用的相關(guān)資料,百度翻譯API是百度面向開發(fā)者推出的免費(fèi)翻譯服務(wù)開放接口,任何第三方應(yīng)用或網(wǎng)站都可以通過使用百度翻譯API為用戶提供實(shí)時(shí)優(yōu)質(zhì)的多語言翻譯服務(wù),需要的朋友可以參考下
    2024-02-02
  • 詳解使用@RequestBody取POST方式的json字符串

    詳解使用@RequestBody取POST方式的json字符串

    這篇文章主要介紹了詳解使用@RequestBody取POST方式的json字符串,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • java中的類型自動(dòng)轉(zhuǎn)換機(jī)制解析

    java中的類型自動(dòng)轉(zhuǎn)換機(jī)制解析

    這篇文章主要介紹了java中的類型自動(dòng)轉(zhuǎn)換機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中正則表達(dá)式 .* 的含義講解

    Java中正則表達(dá)式 .* 的含義講解

    這篇文章主要介紹了Java中正則表達(dá)式 .* 的含義,通過舉例說明了正則表達(dá)式*,+,?的區(qū)別,本文給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 使用java + selenium + OpenCV破解騰訊防水墻滑動(dòng)驗(yàn)證碼功能

    使用java + selenium + OpenCV破解騰訊防水墻滑動(dòng)驗(yàn)證碼功能

    這篇文章主要介紹了使用java + selenium + OpenCV破解騰訊防水墻滑動(dòng)驗(yàn)證碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java注解處理器簡單實(shí)例

    Java注解處理器簡單實(shí)例

    這篇文章主要介紹了Java注解處理器簡單實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 詳解MyBatis日志如何做到兼容所有常用的日志框架

    詳解MyBatis日志如何做到兼容所有常用的日志框架

    這篇文章主要介紹了詳解MyBatis日志如何做到兼容所有常用的日志框架,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring Boot如何集成模板引擎FreeMarker

    Spring Boot如何集成模板引擎FreeMarker

    這篇文章主要介紹了Spring Boot如何集成模板引擎FreeMarker,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

华池县| 靖江市| 茶陵县| 藁城市| 新民市| 通榆县| 衡山县| 班戈县| 托克托县| 阜平县| 双牌县| 岳普湖县| 渝北区| 邢台县| 麻江县| 水城县| 翼城县| 怀安县| 浦县| 桐柏县| 靖远县| 珲春市| 嘉荫县| 天等县| 色达县| 荃湾区| 洱源县| 卓资县| 屯门区| 沾化县| 湾仔区| 临湘市| 襄汾县| 常熟市| 柘城县| 东城区| 巫山县| 蛟河市| 逊克县| 彩票| 都兰县|