Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringJPA1实体处理2个表,我有2个持久化方法_Jpa_Spring Data Jpa - Fatal编程技术网

SpringJPA1实体处理2个表,我有2个持久化方法

SpringJPA1实体处理2个表,我有2个持久化方法,jpa,spring-data-jpa,Jpa,Spring Data Jpa,很多问题看起来都很相似,但我会在这里向您解释区别。 我有10个表,10个表中的每一个都有一个历史表,所以总共有20个表 Normal Table和History Table具有完全相同的列 数据进入Normal表,进行处理,然后传递到该特定表的历史表 列名是随机的,大约有20列(检查我在下面添加的代码) 我以前有20个表的20个实体,直到我发现我可以做下面的注释(使用@SecondaryTable)并有10个实体: @Entity(name = "sepa_card_customers_man

很多问题看起来都很相似,但我会在这里向您解释区别。

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

Normal Table
History Table
具有完全相同的列

数据进入
Normal表
,进行处理,然后传递到该特定表的
历史表

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


我以前有20个表的
20个实体
,直到我发现我可以做下面的注释(使用
@SecondaryTable
)并有
10个实体

@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)
buildinjpa方法时,它会将记录保存在
sepa\u card\u customers\u委托书上

但我还想在历史表上保存实体,所以我创建了下面的,我只是在做一个 将对象保存到历史记录中的本机查询:


我的问题是:


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

我不确定您的一般方法。历史记录表似乎每个用户都有许多记录,因此
@SecondaryTable
才是您真正想要的。看起来更像是一种
一对一的关系。如果您使用Hibernate,请参阅将维护在审计历史记录中为您设置。@AlanHay Ouh刚刚编辑了这个问题,所以看起来不再是这样,它们完全无关,同一个用户再也不会出现,我在示例中犯了错误:)为什么不在主表上使用触发器将数据放入历史表?@RobertNiestroj所以我必须为10个表编写10个触发器?
@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;
    }
}
@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);