По многим вопросам это похоже, но я объясню вам разницу.
У меня есть 10 таблиц, каждая из 10 таблиц имеет одну таблицу истории, то есть всего 20 таблиц.
Normal Table
и History Table
имеют абсолютно одинаковые столбцы.
Данные поступают в Normal Table
, обрабатываются и затем передаются в History Table
этой указанной c таблицы.
Имена столбцов являются случайными, они имеют примерно 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 в методе 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);
Мой вопрос:
Есть ли лучший способ что с помощью нативного запроса?