Spring Data Jpa 復合主鍵的實現(xiàn)
前言
這次大創(chuàng)有個需求,在數(shù)據(jù)庫建表時發(fā)現(xiàn),user表與project表的關(guān)系表 user_project的主鍵為復合主鍵:
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干貨群咨詢(感謝夜升額耐心解答)過后總算是做出來了。這里做個總結(jié),方便日后查閱。
正文
這里采用@IdClass注解的方式來實現(xiàn)復合主鍵;
思路
- 編寫一個復合主鍵類UserProjectMultiKeysClass;
- 通過@IdClass注釋在實體中標注復合主鍵;
- 可以通過EntityManager獲取數(shù)據(jù),或者是直接在Repository 里寫方法;
實現(xiàn)
復合主鍵類
package com.hzy.Model;
import java.io.Serializable;
/**
* Created by huangzhenyang on 2017/9/7.
* UserProject的復合主鍵類
*
* @Param userId
* @Param projectId
* @Param timestamp
* 由這三個共同組成復合主鍵
*/
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方法*** 劃重點!
@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;
}
}
注意:
復合主鍵類必須滿足:
1. 實現(xiàn)Serializable接口;
2. 有默認的public無參數(shù)的構(gòu)造方法;
3. 重寫equals和hashCode方法。equals方法用于判斷兩個對象是否相同,EntityManger通過find方法來查找Entity時,是根據(jù)equals的返回值來判斷的。hashCode方法返回當前對象的哈希碼;
實體類
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標注用于標注實體所使用主鍵規(guī)則的類;
2. 在實體中同時標注主鍵的屬性,比如這段代碼中的userId,projectId以及timestamp ;
獲取數(shù)據(jù)
方法一: 通過EntityManager獲取,比如方法testUserProjectRepository()
方法二:通過Repository獲??;這里記得在extends JpaRepository<UserProject,UserProjectMultiKeysClass>時把id的主鍵類指定為復合主鍵類UserProjectMultiKeysClass
public interface UserProjectRepository extends JpaRepository<UserProject,UserProjectMultiKeysClass>{
// 根據(jù)用戶Id,找出用戶參與的所有UserProject
// TEST PASS
List<UserProject> findByUserId(Integer userId);
// 根據(jù)項目id,找出參與項目的所有UserProject
// TEST PASS
List<UserProject> findByProjectId(Integer projectId);
// 根據(jù)用戶id和項目id 找出所有的UserProject
// TEST PASS
List<UserProject> findByUserIdAndProjectId(Integer userId,Integer projectId);
}
單元測試的代碼
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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
百度翻譯API使用詳細教程(前端vue+后端springboot)
這篇文章主要給大家介紹了關(guān)于百度翻譯API使用的相關(guān)資料,百度翻譯API是百度面向開發(fā)者推出的免費翻譯服務(wù)開放接口,任何第三方應(yīng)用或網(wǎng)站都可以通過使用百度翻譯API為用戶提供實時優(yōu)質(zhì)的多語言翻譯服務(wù),需要的朋友可以參考下2024-02-02
詳解使用@RequestBody取POST方式的json字符串
這篇文章主要介紹了詳解使用@RequestBody取POST方式的json字符串,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
使用java + selenium + OpenCV破解騰訊防水墻滑動驗證碼功能
這篇文章主要介紹了使用java + selenium + OpenCV破解騰訊防水墻滑動驗證碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

