SpringData JPA复合主键
程序员文章站
2022-04-24 22:35:31
...
前言
这次有个需求,给项目角色创建一个模板,在数据库建表时发现,模板表template_project_role的主键需要为复合主键:
正文
这里采用@IdClass注解的方式来实现复合主键;
思路
- 编写一个复合主键类TemplateProjectRoleKey;
- 通过
@IdClass
注释在实体中标注复合主键; - 在
Repository
里标明主键为TemplateProjectRoleKey类;
实现
复合主键类
package com.tlgc.system.mvc.model.projectmanager;
import javax.persistence.Column;
import javax.persistence.Id;
public class TemplateProjectRoleKey implements java.io.Serializable {
/**构造函数,根据自己的主键修改**/
public TemplateProjectRoleKey(){
}
public TemplateProjectRoleKey(String roleId,String templateId){
this.roleId = roleId;
this.templateId = templateId;
}
/**构造函数,根据自己的主键修改**/
/**主键列,根据自己的主键修改**/
private String roleId;
private String templateId;
@Column(name = "template_id", length = 50)
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
@Column(name = "role_id", length = 50)
public String getRoleId() {
return roleId;
}
public void setRoleId(String roleId) {
this.roleId = roleId;
}
/**主键列,根据自己的主键修改**/
/**重点,重写hashCode 和equals方法**/
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
/**重点,根据自己的主键修改**/
result = PRIME * result + ((roleId == null) ? 0 : roleId.hashCode());
result = PRIME * result + ((templateId == null) ? 0 : templateId.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 TemplateProjectRoleKey other = (TemplateProjectRoleKey)obj;
/**重点,根据自己的主键修改**/
if(roleId == null){
if(other.roleId != null){
return false;
}
}else if(!roleId.equals(other.roleId)){
return false;
}
if(templateId == null){
if(other.templateId != null){
return false;
}
}else if(!templateId.equals(other.templateId)){
return false;
}
/**重点,根据自己的主键修改**/
return true;
}
}
实体类
package com.tlgc.system.mvc.model.projectmanager;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity
@Table(name = "template_project_role")
@DynamicInsert(true)
@DynamicUpdate(true)
@IdClass(TemplateProjectRoleKey.class)/**重点,注解@IdClass标注用于标注实体所使用主键规则的类**/
public class TemplateProjectRole implements Serializable {
private static final long serialVersionUID = -7509069780835660418L;
private String roleName;
/**重点,主键列**/
private String roleId;
private String templateId;
@Id
@Column(name = "template_id", length = 50)
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
@Id
@Column(name = "role_id", length = 50)
public String getRoleId() {
return roleId;
}
public void setRoleId(String roleId) {
this.roleId = roleId;
}
/**重点,主键列**/
@Column(name = "role_name")
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
注意:
1. @IdClass标注用于标注实体所使用主键规则的类;
Repository类
标明主键为TemplateProjectRoleKey类,JpaRepository<TemplateProjectRole, TemplateProjectRoleKey>
package com.tlgc.system.mvc.repository.projectmanager;
import com.tlgc.system.mvc.model.projectmanager.TemplateProjectRole;
import com.tlgc.system.mvc.model.projectmanager.TemplateProjectRoleKey;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface TemplateProjectRoleRepository extends JpaRepository<TemplateProjectRole, TemplateProjectRoleKey>, JpaSpecificationExecutor<TemplateProjectRole> {
}
上一篇: Android使用Intent传输数据
下一篇: 封装图片处理方法