当前位置: 首页 > 知识库问答 >
问题:

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

冷善
2023-03-14

我有一个与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
)

上面是两个表,PROD\u GEN\u IDTAB\u PROD\u GEN\u ID是子表中的参考键。

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

共有2个答案

武成和
2023-03-14

@table(uniqueConstraint={@UniqueConstraint(柱名={TAB_PROD_ID,TAB_PROD_GEN_ID})})

公共类TabProd{。。。

申辉
2023-03-14

试试这个:

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;
    }
}

小孩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;
    }
}

后果

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

--
-- 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`)
)

希望它能起作用。

如果这不是期望的结果,那么请告诉我。

 类似资料:
  • 我希望以以下方式映射实体: 我有一个用户,他买了一辆车(特定的品牌、型号和变体)。 为此,我创建了以下类。 Car.java汽车 CarModel.java 汽车变体.java 最后,用户.java 现在,我的问题是。 在现实生活中,用户可能拥有许多汽车,每辆汽车都有特定的品牌、型号和变体。我想用JPA / Hibernate实现这样的功能。 我可以定义与和的关系。在这种情况下,如果我执行或我最终

  • 我是初学Hibernate的,我不知道如何使用JPA或Hibernate注释来映射这个简单的模型。我尝试建模是提供商具有全局评级,并且全局评级实体的标识符与提供商实体的标识符相同(单向OneToOne),换句话说,我希望实体全局评级中的外键同时是主的和外部的,但是提供商实体也具有实体全局评级的外键。这可能吗?

  • 但是当我运行应用程序时,我会得到以下异常:

  • 我对下面的问题有很大的麻烦。我有一个实体“home”,我在代码中的两个不同位置使用它。问题是,需要根据使用实体的类将其映射到不同的表。 有办法做到我描述的那样吗?

  • 我有一个类CustomerProfile,它映射到一个表CUST_PROFILE。我们需要在一个单独的表中维护关闭的概要文件,该表将具有相同的模式。我在SO中读过很多问题,特别是下面的问题(下面有一个总结了很多类似问题的答案) 每个实体Hibernate两个表 从中我可以理解,使用MappedSuperclass以外的注释很难获得相同的结果。但可以使用xml映射。 我之所以不愿使用Mappedsu

  • 我有三个表:用户,角色,董事会。每个用户可以有多个板,但在一个板中用户只能有一个角色。我创建了三个类并添加了注释: Hibernate创建一个新表,如下所示: 我使用的是hibernate 4.2.2。