一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn)

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

2021-07-31 12:26冬天飲雪水 Java教程

這篇文章主要介紹了Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

?
1
2
3
4
5
6
7
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干貨群咨詢(感謝夜升額耐心解答)過后總算是做出來(lái)了。這里做個(gè)總結(jié),方便日后查閱。

正文

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

思路

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

實(shí)現(xiàn)

復(fù)合主鍵類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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無(wú)參數(shù)的構(gòu)造方法;
3. 重寫equals和hashcode方法。equals方法用于判斷兩個(gè)對(duì)象是否相同,entitymanger通過find方法來(lái)查找entity時(shí),是根據(jù)equals的返回值來(lái)判斷的。hashcode方法返回當(dāng)前對(duì)象的哈希碼;

實(shí)體類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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è)試的代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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());
    }
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/qq_35056292/article/details/77892012

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产欧美另类va在线观看 | 亚洲剧情在线 | 大伊人青草狠狠久久 | 日本高清视频在线观看 | a在线观看欧美在线观看 | 天天干天天日天天射天天操毛片 | 美女视频黄a | 男人爱看的网站 | 国产在线观看精品 | 肥胖老寡妇做性 | 亚洲色图第一页 | 人妇小说 | 亚洲高清免费在线观看 | 乌克兰粉嫩摘花第一次 | 成人在线免费观看视频 | 天堂男人在线 | 欧美夫妇野外交换hd高清版 | 好大好爽好硬我要喷水了 | 国产一区二区在线免费观看 | www.伊人| 操动漫美女视频 | 国色天香 社区视频 | 好奇害死猫在线观看 | 欧美破苞合集 magnet | 男人和女人日 | 538免费精品视频搬运工 | 精品成人网 | 国产精品www | 亚洲欧美久久久久久久久久爽网站 | 国内久久婷婷综合欲色啪 | 免费观看俄罗斯特黄特色 | 日本ssswww大学生 | 日本道色综合久久影院 | 免费av在线看 | 美女被狂揉下部羞羞动漫 | 美女胸又大又黄又www小说 | 欧美三级一区二区 | 小苹果日本在线观看 | 国产福利自产拍在线观看 | 日韩欧美国产在线 | 亚洲精品6久久久久中文字幕 |