java - 如何使用 hibernate 注释将 2 个唯一列映射为子实体中的 2 个外键

标签 java hibernate

我有一个与 hibernate 映射相关的查询。我必须使用 hibernate 将父表的 2 个唯一列映射为子实体中的 2 个外键。

例如 - 父表 -

CREATE TABLE TAB_PROD
(
    "TAB_PROD_ID"                    NUMBER(30,0) NOT NULL ENABLE,

    "PROD_GEN_ID"                    NUMBER(30,0) NOT NULL ENABLE,

    "TAB_PROD_GEN_ID"                NUMBER(30,0) NOT NULL ENABLE,

    CONSTRAINT "PK_TAB_PROD" PRIMARY KEY ("TAB_PROD_ID")

    CONSTRAINT "AK_TAB_PROD_GEN" UNIQUE ("PROD_GEN_ID", "TAB_PROD_GEN_ID")

)

子表 -

CREATE TABLE CHILD
(
    "CHILD_ID" NUMBER(30,0) NOT NULL ENABLE,

    "PROD_GEN_ID"                   NUMBER(30,0) NOT NULL ENABLE,

    "TAB_PROD_GEN_ID"               NUMBER(30,0) NOT NULL ENABLE,

    CONSTRAINT "FK_CHD" FOREIGN KEY ("PROD_GEN_ID", "TAB_PROD_GEN_ID") 
    REFERENCES TAB_PROD ("PROD_GEN_ID", "TAB_PROD_GEN_ID") ENABLE
)

上面是 2 个表,PROD_GEN_IDTAB_PROD_GEN_ID 是子表中的引用键。

请帮助我使用注释在 hibernate 中正确映射。

最佳答案

试试这个:

TAB_PROD.java

import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity(name="TAB_PROD")
public class TAB_PROD implements Serializable {
    @Id
    private BigDecimal TAB_PROD_ID;

    @Column (name = "PROD_GEN_ID", unique = true)
    private BigDecimal PROD_GEN_ID;

    @Column (name = "TAB_PROD_GEN_ID", unique = true)
    private BigDecimal TAB_PROD_GEN_ID;

    public BigDecimal getTAB_PROD_ID() {
        return TAB_PROD_ID;
    }

    public void setTAB_PROD_ID(BigDecimal TAB_PROD_ID) {
        this.TAB_PROD_ID = TAB_PROD_ID;
    }

    public BigDecimal getPROD_GEN_ID() {
        return PROD_GEN_ID;
    }

    public void setPROD_GEN_ID(BigDecimal PROD_GEN_ID) {
        this.PROD_GEN_ID = PROD_GEN_ID;
    }

    public BigDecimal getTAB_PROD_GEN_ID() {
        return TAB_PROD_GEN_ID;
    }

    public void setTAB_PROD_GEN_ID(BigDecimal TAB_PROD_GEN_ID) {
        this.TAB_PROD_GEN_ID = TAB_PROD_GEN_ID;
    }
}

CHILD.java

import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.OneToOne;

@Entity(name="CHILD")
public class CHILD {
    @Id
    private BigDecimal CHILD_ID;

    @OneToOne
    @JoinColumns({
        @JoinColumn(name = "PROD_GEN_ID", referencedColumnName = "PROD_GEN_ID"),
        @JoinColumn(name = "TAB_PROD_GEN_ID", referencedColumnName = "TAB_PROD_GEN_ID")
    })
    private TAB_PROD tab_prod;

    public BigDecimal getCHILD_ID() {
        return CHILD_ID;
    }

    public void setCHILD_ID(BigDecimal CHILD_ID) {
        this.CHILD_ID = CHILD_ID;
    }

    public TAB_PROD getTab_prod() {
        return tab_prod;
    }

    public void setTab_prod(TAB_PROD tab_prod) {
        this.tab_prod = tab_prod;
    }
}

Result

-- --------------------------------------------------------

--
-- Table structure for table `child`
--

CREATE TABLE IF NOT EXISTS `child` (
  `CHILD_ID` decimal(19,2) NOT NULL,
  `PROD_GEN_ID` decimal(19,2) DEFAULT NULL,
  `TAB_PROD_GEN_ID` decimal(19,2) DEFAULT NULL,
  PRIMARY KEY (`CHILD_ID`)
)

-- --------------------------------------------------------

--
-- Table structure for table `tab_prod`
--

CREATE TABLE IF NOT EXISTS `tab_prod` (
  `TAB_PROD_ID` decimal(19,2) NOT NULL,
  `PROD_GEN_ID` decimal(19,2) DEFAULT NULL,
  `TAB_PROD_GEN_ID` decimal(19,2) DEFAULT NULL,
  PRIMARY KEY (`TAB_PROD_ID`),
  UNIQUE KEY `UK_iublvy229lc81t85wqlfgs0fm` (`PROD_GEN_ID`,`TAB_PROD_GEN_ID`),
  UNIQUE KEY `UK_omdfd8sbm741v0yqiv4wist1t` (`PROD_GEN_ID`),
  UNIQUE KEY `UK_3ox5nbcchj4wrjkyggrl7s01j` (`TAB_PROD_GEN_ID`)
)

希望它能起作用。

如果这不是想要的结果,请告诉我。

关于java - 如何使用 hibernate 注释将 2 个唯一列映射为子实体中的 2 个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35201323/

相关文章:

java - 快速排序 Q : Finitely many distinct keys

java - 如何以编程方式配置 log4j 2.5 RollingRandomAccessFileAppender 以限制文件而不重命名?

java - 是否有为日志记录添加注释的 Java 库?

Java 线程 ID 没有改变

java - JTextPane HTML 图像集成

java - Spring Boot Hibernate 将枚举集映射到 boolean 列

java - 无法使用 spring/hibernate 将两个实体注入(inject)到一个 jsp 中

java - 创建@OneToOne时抛出错误无法检索ResultSet

java - 事务注释在 Spring Boot 2.1.3 中不起作用

java - 即使使用@Fetch(FetchMode.JOIN),JPA + Hibernate 也会出现太多查询问题