java - JPA 实体外键是来自其他实体的主键
问题描述
如果这篇文章的标题无法理解,我很抱歉
我在 Oracle 数据库中有几个表,我想在 Spring Boot JPA 中生成每个实体。
这是我的一块:
CREATE TABLE T1 (
C1 NUMBER(4) NOT NULL,
C2 NUMBER(5) NOT NULL,
C3 NUMBER(2) NOT NULL,
C4 NUMBER(9) NOT NULL,
C5 VARCHAR2(10 CHAR) NOT NULL,
CONSTRAINT PK_T1 PRIMARY KEY (C1,C2,C3,C4)
);
CREATE TABLE T2 (
C1 NUMBER(4) NOT NULL,
C2 NUMBER(5) NOT NULL,
C3 NUMBER(2) NOT NULL,
C4 NUMBER(9) NOT NULL,
C5 NUMBER(6) NOT NULL,
C6 NUMBER(3) NOT NULL,
C7 VARCHAR2(10 CHAR) NOT NULL,
C8 VARCHAR2(20 CHAR) NOT NULL,
CONSTRAINT PK_T2 PRIMARY KEY (C1,C2,C3,C4,C5,C6),
CONSTRAINT FK_T2_T1 FOREIGN KEY (C1,C2,C3,C4) REFERENCES T1
);
我需要将这两个表都映射到 JPA 实体,但我不知道如何映射它们。
这些是 Java 中的实体类:
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Table(name = "T1")
@Data
public class T1Bean implements Serializable {
@EmbeddedId
private T1PK pk;
@Basic
@Column(name = "C5", nullable = false)
private String c5;
}
------------------
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import lombok.Data;
@Data
@Embeddable
public class T1PK implements Serializable {
@Basic
@Column(name = "C1", nullable = false)
private int c1;
@Basic
@Column(name = "C2", nullable = false)
private int c2;
@Basic
@Column(name = "C3", nullable = false)
private int c3;
@Basic
@Column(name = "C4", nullable = false)
private long c4;
}
------------------
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Table(name = "T2")
@Data
public class T2Bean implements Serializable {
@EmbeddedId
private T2PK pk;
@Basic
@Column(name = "C7", nullable = false)
private String c7;
@Basic
@Column(name = "C8", nullable = false)
private String c8;
@OneToOne
private T1Bean t1Bean;
}
------------------
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import lombok.Data;
@Data
@Embeddable
public class T2PK implements Serializable {
@Basic
@Column(name = "C1", nullable = false)
private int c1;
@Basic
@Column(name = "C2", nullable = false)
private int c2;
@Basic
@Column(name = "C3", nullable = false)
private int c3;
@Basic
@Column(name = "C4", nullable = false)
private long c4;
@Basic
@Column(name = "C5", nullable = false)
private int c5;
@Basic
@Column(name = "C6", nullable = false)
private int c6;
}
T2Bean 实体中缺少哪个注释以使每个实体之间的映射看起来不错?
我只放了@OneToOne 注释,但我不知道是否正确。
解决方案
首先你只需要映射两个类 T1 和 T2 这些类被认为是 Bean 或模块或实体
实体 T1
@Entity
@Table(name = "T1")
@Data
public class T1 implements Serializable {
@EmbeddedId
private <type> c1;
private <type> c2;
private <type> c3;
private <type> c4;
private T2 t2;
/* getters & setters */
@Column(name = "C1", nullable = false)
public String getC1(){
return c1;
}
public void setC1(c1){
this.c1 = c1;
}
// .... All other classes are the same
@OneToOne(fetch = FetchType.EAGER, targetEntity = T2.class)
public T2 getT2(){
return t2;
}
public void setT2(t2){
this.t2 = t2;
}
实体 T2
@Entity
@Table(name = "T2")
@Data
public class T2 implements Serializable {
@EmbeddedId
private <type> c1;
private <type> c2;
private <type> c3;
private <type> c4;
private <type> c5;
private <type> c6;
private <type> c7;
private <type> c8;
private T1 t1;
/* getters & setters */
@Column(name = "C1", nullable = false)
public String getC1(){
return c1;
}
public void setC1(c1){
this.c1 = c1;
}
//Foreigin key
@OneToOne(fetch = FetchType.EAGER, targetEntity = T1.class)
@JoinColumn(name ="c1", nullable = false)
public T1 getT1(){
return t1;
}
public void setT1(t1){
this.t1 = t1;
}
推荐阅读
- c - 将一维列表添加到二维列表
- sqlite - 将格式从 DD/MM/YYYY hh:mm 更改为 YYYY-MM-DD hh:mm
- c# - 如何在 ViewModel 类中调用 TranslateTo?
- reactjs - 为什么不使用上下文 API 在 React JS 中使用此效果?
- javascript - Puppeteer:waitForSelector 然后单击不起作用
- reactjs - 无法使用 npm start 启动项目
- ios - 当collectionView有约束时在tableview单元格上形成自动高度约束
- r - 为什么 geom_smooth 不绘图?(唯一值不足错误)
- java - FXMLLoader javafx 中的异常
- authentication - Drupal 7 重置密码