【发布时间】:2021-12-21 15:09:49
【问题描述】:
如果这篇文章的标题无法理解,我很抱歉
我在 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注解不知道对不对
【问题讨论】:
-
@OneToOne 仅在数据库中存在 1:1 关系时才是正确的。你试过这个吗?
@OneToOne(mappedBy="pk") -
您缺少外键的定义,告诉 JPA 如何处理您用于 OneToOne 的字段并重用于主键。 baeldung.com/jpa-join-column 从 1:1 的角度解释,但可能会使用 MapsId (eclipse.org/eclipselink/api/2.6/index.html?javax/persistence/…),但您需要对 T2PK 类进行一些更改,因此它也封装了 T1PK id 类 - 请参阅 docs.oracle.com/cd/E28389_01/apirefs.1111/e26376/javax/…
标签: java oracle spring-boot jpa orm