spring 事务未提交前jpa @version 自动更新版本
spring jpa @version auto update version before transaction uncommited
下面是我的代码。 Acct 对象有一个字段版本,我使用了@version 注释。
我猜是因为我没有提交交易。
它产生了脏数据。
并且在我查询数据库后 table。
jpa 自动更新脏数据的版本。
但除了版本字段。其他领域不是update.it让我感到困惑
saveFlush 将解决问题。但是太慢了!
// open transaction
Acct acct = acctRepository.findByAcctNo("a");
System.out.println("version1:" + acct.getVersion()); // 1
for(int i = 0; i < 100 ; i ++) {
acct.deposit(BigDecimal.ONE);
}
System.out.println("version2:" + acct.getVersion()); // 100
Acct acctOther = acctRepository.findByAcctNo("b");
System.out.println("version3:" + acct.getVersion()); // 2 other info is equal with version2
// commit transaction
您的问题是您可能在 acct.deposit(BigDecimal.ONE)
中递增 acct.version
。所以它变成了 100
但是您不应该自己递增 version
字段,hibernate 会在刷新更新操作期间自动递增它。
Hibernate 也 auto flush
在会话中执行 acctRepository.findByAcctNo("b")
之前的任何内容。当它刷新时,它会忽略您手动对 account.version
进行的每个更新,并根据其会话中的内容自动递增它。在它的会话中,它会记住,它给了你版本 1,所以它将它递增 1 到 2 并刷新它。就在刷新之前,它会重置你输入的不正确版本
下面是我的代码。 Acct 对象有一个字段版本,我使用了@version 注释。
我猜是因为我没有提交交易。
它产生了脏数据。
并且在我查询数据库后 table。
jpa 自动更新脏数据的版本。 但除了版本字段。其他领域不是update.it让我感到困惑
saveFlush 将解决问题。但是太慢了!
// open transaction
Acct acct = acctRepository.findByAcctNo("a");
System.out.println("version1:" + acct.getVersion()); // 1
for(int i = 0; i < 100 ; i ++) {
acct.deposit(BigDecimal.ONE);
}
System.out.println("version2:" + acct.getVersion()); // 100
Acct acctOther = acctRepository.findByAcctNo("b");
System.out.println("version3:" + acct.getVersion()); // 2 other info is equal with version2
// commit transaction
您的问题是您可能在
acct.deposit(BigDecimal.ONE)
中递增acct.version
。所以它变成了 100但是您不应该自己递增
version
字段,hibernate 会在刷新更新操作期间自动递增它。Hibernate 也
auto flush
在会话中执行acctRepository.findByAcctNo("b")
之前的任何内容。当它刷新时,它会忽略您手动对account.version
进行的每个更新,并根据其会话中的内容自动递增它。在它的会话中,它会记住,它给了你版本 1,所以它将它递增 1 到 2 并刷新它。就在刷新之前,它会重置你输入的不正确版本