首页 > 解决方案 > Spring JPA 1 Entity 处理 2 个表,我有 2 个持久化方法

问题描述

它看起来与许多问题相似,但我会在这里解释你的区别。

我有 10 张表,10 张表中的每一张都有一个历史表,所以总共 20 张表。

Normal TableHistory Table具有完全相同的列。

数据进入Normal Table,得到处理,然后传递到History Table该特定表中。

列名是随机的,它们有 20 列(检查我在下面添加的代码

Normal Table            

╔════╦══════════════╦══════╗
║ Id ║  Name        ║ Etc  ║
╠════╬══════════════╬══════╣
║  1 ║ Jeff Atwood  ║ 1234 ║
║  2 ║ Geoff Dalgas ║ 1234 ║
║  3 ║ Jarrod Dixon ║ 1234 ║
║  4 ║ Joel Spolsky ║ 1234 ║
╚════╩══════════════╩══════╝ 

History of Normal Table

╔════╦══════════════╦══════╗
║ Id ║  Name        ║ Etc  ║
╠════╬══════════════╬══════╣
║  1 ║ Jeff Atwood  ║ 3456 ║
║  2 ║ Geoff Dalgas ║ 3456 ║
║  3 ║ Jarrod Dixon ║ 3456 ║
║  4 ║ Joel Spolsky ║ 3456 ║

║... ║ ............ ║  ... ║
╚════╩══════════════╩══════╝ 

我曾经有20 entities20 张桌子,直到我发现我可以做以下(使用@SecondaryTable)注释并拥有10 entities

@Entity(name = "sepa_card_customers_mandate")
@Table
@SecondaryTable(name = "sepa_card_customers_mandate_history")
public class CardCustomerMandate extends Mandate {

    @Column(name = "RECEIPT_NUMBER")
    private String receiptNumber;

    @Column(name = "GAMES")
    private String games;

    public CardCustomerMandate() {
    }

    public CardCustomerMandate(final Mandate mandate, final String receiptNumber, final String games) {
        super(mandate);
        this.receiptNumber = receiptNumber;
        this.games = games;
    }

    public String getReceiptNumber() {
        return receiptNumber;
    }

    public void setReceiptNumber(final String receiptNumber) {
        this.receiptNumber = receiptNumber;
    }

    public String getGames() {
        return games;
    }

    public void setGames(final String games) {
        this.games = games;
    }
}

一切都好,直到这里。问题来了,当我使用 ( persist(Instance T)build in JPA 方法时,它将记录保存在sepa_card_customers_mandate.

但是后来我也想将实体保存在历史表中,所以我创建了以下内容,我只是在执行本机查询以将对象保存到历史记录中

@Modifying
@Query(value = "INSERT INTO sepa_subscription_credit_mandate_history " +
    " (PLAYER_ID, FIRST_NAME, LAST_NAME, IBAN, BIC, BALANCE, SUBSCRIPTION_ID, DRAW_NUMBER, WINNING_DATE, GAMES, BIT8_UNIQUE_ID, SEPA_UNIQUE_ID, CREATED_AT) " +
    " VALUES(:#{#m.getPlayerId()}, :#{#m.getFirstName()}, :#{#m.getLastName()}, :#{#m.getIban()}, :#{#m.getBic()}, :#{#m.getBalance()}, " +
    " :#{#m.getSubscriptionID()}, :#{#m.getDrawNumber()}, :#{#m.getWinningDate()}, :#{#m.getGames()}, :#{#m.getBit8UniqueId()}, " +
    " :#{#m.getSepaUniqueId()}, :#{#m.getCreatedAt()})", nativeQuery = true)
void saveHistory(@Param("m") SubscriptionCreditMandate m);

我的问题是:

有没有更好的方法来使用本机查询?

标签: jpaspring-data-jpa

解决方案


推荐阅读