【问题标题】:spring jpa @version auto update version before transaction uncommited [closed]spring jpa @version 在事务未提交之前自动更新版本[关闭]
【发布时间】:2020-11-21 00:55:38
【问题描述】:

下面是我的代码。 Acct 对象有一个字段版本,我使用了@version 注释。

我猜是因为我没有提交交易。

它产生了脏数据。

在我向数据库查询同一张表之后。

jpa 自动更新脏数据的版本。 但除了版本字段。其他字段没有更新,搞得我一头雾水

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

【问题讨论】:

    标签: java spring jpa version


    【解决方案1】:
    • 您的问题是您可能正在增加 acct.deposit(BigDecimal.ONE) 内的 acct.version。所以它变成了 100

    • 但是你不应该自己增加 version 字段,hibernate 会在刷新更新操作期间自动增加它。

    • 在执行acctRepository.findByAcctNo("b") 之前的会话中到目前为止,休眠也auto flush。当它刷新时,它会忽略您手动对account.version 所做的每一次更新,并且只是根据它在会话中的内容自动增加它。在它的会话中,它会记住,它给了你版本 1,所以它将它增加 1 到 2 并刷新它。就在刷新之前,它会重置您放置的错误版本

    【讨论】:

    • 是的,你是对的。我在acct.deposit 方法中增加acct.version。除了我需要在acct.deposit 方法中保存帐户修改记录(它包含字段 beforeVersion 和 afterVersion)。如果我不修改版本手册,修改记录的字段 beforeVersion,afterVersion 始终不变。你能不能给点建议。
    • 抱歉,您的 wuestion 已关闭。您可以通过添加 Acct 实体类和您遇到的问题来编辑问题吗?
    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多