jpa - Spring JPA 1 Entity 处理 2 个表,我有 2 个持久化方法
问题描述
它看起来与许多问题相似,但我会在这里解释你的区别。
我有 10 张表,10 张表中的每一张都有一个历史表,所以总共 20 张表。
Normal Table
并History 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 entities
20 张桌子,直到我发现我可以做以下(使用@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);
我的问题是:
有没有更好的方法来使用本机查询?
解决方案
推荐阅读
- mongodb - 使用 Java 中的 DBCollection find(DBObject) 方法在 mongoDB 日期中缺少毫秒
- java - 在 Java 中使用单列递增值创建 Spark 数据集
- angular - 输入5-6位数字后如何查找卡类型并以角度更改卡图像
- asp.net - PSEXEC 在远程服务器上启动计算器仅在调试 vb.net 时有效
- bash - 从文件中选择列并保存输出
- stored-procedures - informix 12.10 使用单个文件创建多个存储过程
- sql - SQL 复制/负载管理的最佳实践
- reactjs - 无法在 redux saga 的 yield 调用中使用 fetch
- javascript - 从提供的 JSON 数据中检索特定数据
- gradle - 未找到 Grails CXF 插件