具有复合主键和单键的实体映射

时间:2020-05-21 17:07:59

标签: jpa

用例: 如果产品名称发生更改,则旧发票必须使用其发出发票时的名称。有一个用于对产品进行版本控制的ID_MOD字段,以及一个包含当前变更编号的ACTUAL_MOD字段。 ID和MOD字段存储在发票表中,并且始终链接到相应的产品版本。但是,价格与产品版本无关,因此仅在其中存储ID_PRODUCT字段就足够了。

scripted_metric

例如:

Domain model:

|---------------------|
|Product              |
|---------------------|
|id              int  |
|id_mod          int  |
|actual_mod      int  |
|product_name    str  |
|PK(id, id_mod)       |
|---------------------|

如果我愿意获得实际的Orange产品

id  id_mod  actual_mod  product_name
1   1       3           Orange   
1   2       3           Orange Spn
1   3       3           Orange from Spain 
2   1       2           Wtr melon   
2   2       2           Water melon

结果:

select * from product where id = 1 and id_mod = actual_mod

例如:

id  id_mod  actual_mod  product_name
1   3       3           Orange from Spain 


|-------------------------|
|Invoice                  |
|-------------------------|
|invoice_number      str  |
|product_id          int  |
|product_id_mod      int  |
|invoice_issue_date  Date |
|...                      |
|-------------------------|

例如:

invoice_number  product_id  product_id_mod  invoice_issue_date
IN_01           1           1               2020-01-01              the product name at this moment: Orange
IN_02           1           2               2020-02-13              the product name at this moment: Orange Spn
IN_03           1           3               2020-03-25              the product name at this moment: Orange  from Spain

|---------------|
|product_price  |
|---------------|
|product_id     |
|date_from      |
|price          |
|---------------|

表DDL:

product_id  date_from   price
1           2019-05-13  5
1           2020-01-01  6
1           2020-03-05  8

实体:

CREATE TABLE PRODUCTS (
    ID         INT NOT NULL,
    ID_MOD     INT NOT NULL,
    ACTUAL_MOD INT NOT NULL,
    NAME       VARCHAR(100),
    PRIMARY KEY PK_PRODUCTS (ID, ID_MOD)
);

CREATE TABLE PRODUCT_PRICES(
    ID_PRODUCT INT  NOT NULL,
    FROM_DATE  DATE NOT NULL,
    PRICE      NUMERIC(22, 6),
    PRIMARY KEY PK_PRODUCT_PRICES (ID_PRODUCT, FROM_DATE),
    CONSTRAINT FK_PRODUCT_PRICES FOREIGN KEY (ID_PRODUCT) REFERENCES PRODUCTS (ID)
);

CREATE TABLE INVOICE(
    INVOICE_NUMBER     VARCHAR(15) NOT NULL,
    INVOICE_ISSUE_DATE DATE        NOT NULL,
    PRIMARY KEY PK_INVOICE (INVOICE_NUMBER)
);

CREATE TABLE INVOICE_LINES(
    ID_LINE        INT         NOT NULL AUTO_INCREMENT,
    INVOICE_NUMBER VARCHAR(15) NOT NULL,
    ID_PRODUCT     INT         NOT NULL,
    ID_PRODUCT_MOD INT         NOT NULL,
    PRIMARY KEY PK_INVOICE_LINES (ID_LINE),
    FOREIGN KEY FK_INVOICE_LINES_01 (INVOICE_NUMBER) REFERENCES INVOICE (INVOICE_NUMBER),
    FOREIGN KEY FK_INVOICE_LINES_02 (ID_PRODUCT, ID_PRODUCT_MOD) REFERENCES PRODUCTS (ID, ID_MOD)
);

例外::来自实体类[class Products]的带注释元素[method getProductPrices]的@JoinColumns不完整。当源实体类使用复合主键时,必须使用@JoinColumns为每个联接列指定@JoinColumn。名称和referencedColumnName元素都必须在每个此类@JoinColumn中指定。

如何将ProductPrices映射到Products?

0 个答案:

没有答案