Hibernate JPA Внешний ключ DB2 на основе составного уникального ключа - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть 2 таблицы parent и child, parent как 1 Primary Key и составной уникальный ключ (комбинация из 2 столбцов [UN_KEY1, UN_KEY2]).Теперь в дочерней таблице я называю эти 2 столбца внешними ключами.Когда я пытаюсь сгенерировать объект в затмении, он показывает отношение «многие к одному» и отображает родительские столбцы.Но когда я генерирую эти два столбца не генерируются в родительском объекте.Как выполнить транзакцию, например, добавить, обновить, удалить в этих объектах без этих столбцов

Таблица

--drop table  "TBL_PARENT";

CREATE TABLE "TBL_PARENT"(
  "S_ID" INTEGER NOT NULL  GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1, NO MINVALUE, NO MAXVALUE, CACHE 20),
  "UN_KEY1" Integer NOT NULL,
  "UN_KEY2" Smallint NOT NULL,
  "SOME_COL1" Integer
);

-- Add keys for table TBL_PARENT

ALTER TABLE "TBL_PARENT" ADD CONSTRAINT "TBL_PARENTKEY3" PRIMARY KEY ("S_ID");

ALTER TABLE "TBL_PARENT" ADD CONSTRAINT "TBL_PARENTKey4" UNIQUE ("UN_KEY1","UN_KEY2");

--drop table  "TBL_PARENT";

CREATE TABLE "TBL_CHILD"(
  "S_ID" Integer NOT NULL GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1, NO MINVALUE, NO MAXVALUE, CACHE 20),
  "UN_KEY1" Integer,
  "UN_KEY2" Integer,
  "SOME_COL2" Integer
  );


ALTER TABLE "TBL_CHILD" ADD CONSTRAINT "TBL_CHILD_KEY3" PRIMARY KEY ("S_ID");

ALTER TABLE "TBL_CHILD" ADD CONSTRAINT "TBL_CHILD_FK" FOREIGN KEY ("UN_KEY1", "UN_KEY2") REFERENCES "TBL_PARENT" ("UN_KEY1", "UN_KEY2");

Сгенерированный код:

@Entity
@Table(name="TBL_PARENT")
@NamedQuery(name="TblParent.findAll", query="SELECT t FROM TblParent t")
public class TblParent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="S_ID")
    private int sId;

    @Column(name="SOME_COL1")
    private int someCol1;

    //bi-directional many-to-one association to TblChild
    @OneToMany(mappedBy="tblParent")
    private Set<TblChild> tblChilds;

    public TblParent() {
    }

    public int getSId() {
        return this.sId;
    }

    public void setSId(int sId) {
        this.sId = sId;
    }

    public int getSomeCol1() {
        return this.someCol1;
    }

    public void setSomeCol1(int someCol1) {
        this.someCol1 = someCol1;
    }

    public Set<TblChild> getTblChilds() {
        return this.tblChilds;
    }

    public void setTblChilds(Set<TblChild> tblChilds) {
        this.tblChilds = tblChilds;
    }

    public TblChild addTblChild(TblChild tblChild) {
        getTblChilds().add(tblChild);
        tblChild.setTblParent(this);

        return tblChild;
    }

    public TblChild removeTblChild(TblChild tblChild) {
        getTblChilds().remove(tblChild);
        tblChild.setTblParent(null);

        return tblChild;
    }

}

@Entity
@Table(name="TBL_CHILD")
@NamedQuery(name="TblChild.findAll", query="SELECT t FROM TblChild t")
public class TblChild implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="S_ID")
    private int sId;

    @Column(name="SOME_COL2")
    private int someCol2;

    //bi-directional many-to-one association to TblParent
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="UN_KEY1", referencedColumnName="UN_KEY1"),
        @JoinColumn(name="UN_KEY2", referencedColumnName="UN_KEY2")
        })
    private TblParent tblParent;

    public TblChild() {
    }

    public int getSId() {
        return this.sId;
    }

    public void setSId(int sId) {
        this.sId = sId;
    }

    public int getSomeCol2() {
        return this.someCol2;
    }

    public void setSomeCol2(int someCol2) {
        this.someCol2 = someCol2;
    }

    public TblParent getTblParent() {
        return this.tblParent;
    }

    public void setTblParent(TblParent tblParent) {
        this.tblParent = tblParent;
    }

}

1 Ответ

0 голосов
/ 04 февраля 2019

Добавьте следующее к объекту TblParent

@Column(name = "UN_KEY1")
private int uniqueKey1;
@Column(name = "UN_KEY2")
private int uniqueKey2;

При создании нового объекта вы будете делать следующее

TblParent p = new TblParent();
p.setSId(1);
p.setSomeCol1(12);
p.setUniqueKey1(12);
p.setUniqueKey2(14);
p.setTblChilds(new HashSet<TblChild>());

TblChild c = new TblChild();
c.setSId(1);
c.setSomeCol2(14);
c.setTblParent(p);
p.getTblChilds.add(c);

При создании этого родительского объекта платформа автоматически добавитзначения внешнего ключа в таблицу TblChild.

...