首页 > 解决方案 > 当我在主键中共享列(但不仅限于)时如何映射 jpa 实体

问题描述

我必须在很多这样的情况下维护/改进遗留系统。这个例子

create table COMPANY(
    COMP_ID_COMPANY NUMBER(10),
    COMP_NAME VARCHAR(32),
    /*... MANY FIELDS*/
    PRIMARY KEY (COMP_ID_COMPANY)
);

create table BUSINESS_UNIT(
    BUZZ_ID_COMPANY NUMBER(10),
    BUZZ_ID_BUZZUNIT NUMBER(10),
    /*... MANY FIELDS*/
    PRIMARY KEY (BUZZ_ID_COMPANY, BUZZ_ID_BUZZUNIT),
    CONSTRAINT FK_BUZZ_COMP FOREIGN KEY (BUZZ_ID_COMPANY) REFERENCES COMPANY (COMP_ID_COMPANY)
)

create table BRANCH(
    BRAN_ID_COMPANY NUMBER(10),
    BRAN_ID_BRANCH NUMBER(10),
    BRAN_NAME VARCHAR(32),
    /*... MANY FIELDS*/
    BRAN_ID_BUZZUNIT NUMBER(10) nullable, /*HERE IS THE PROBLEM*/
    PRIMARY KEY (BRAN_ID_COMPANY, BRAN_ID_BRANCH),
    CONSTRAINT FK_BRAN_BUZZ FOREIGN KEY (BRAN_ID_COMPANY, BRAN_ID_BUZZUNIT) REFERENCES BUSINESS_UNIT (BUZZ_ID_COMPANY, BUZZ_ID_BUZZUNIT) /*HERE IS THE PROBLEM*/
);

前两个单元的映射很简单,我必须为 COMPANY PK 创建一个类并使用@EmbeddedId 和@Embeddable 进行注释。但是,在 Branch 课上我有这个问题

@Embeddable
class BranchPk{
    @Column(name="BRAN_ID_COMPANY")
    private Long branIdCompany;
    @Column(name="BRAN_ID_BRANCH")
    private Long branIdBranch;
}

@Entity
@Table(name="BRANCH"
class Branch {
    @EmbeddedId
    private BranchPk pk;

    @ManyToOne 
    @JoinColumns({
        @JoinColumn(name="BRAN_ID_COMPANY", insertable=false, updatable=false), //I cannot keep this field insertable or updatable because makes part of the primary key
        @JoinColumn(name="BRAN_ID_BUZZUNIT"), //JPA doesn't allow me to mix the insertable/updatable fields with noninsertable/nonupdatable ones
    })
    private BusinessUnit businessUnit;
}

问题是:我如何映射此类允许 businessUnit 属性为空而不从 PK 中删除 branIdCompany?我希望只使用 JPA 来解决这个问题,但是使用休眠特性对我来说不是问题。

标签: javahibernatejpa

解决方案


推荐阅读