SpringJPA1实体处理2个表,我有2个持久化方法
很多问题看起来都很相似,但我会在这里向您解释区别。 我有10个表,10个表中的每一个都有一个历史表,所以总共有20个表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
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);