jpa 事务处理期间版本未递增

bqujaahr  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(122)

我有以下场景:
1.事务开始

  1. person.getVersion()-->返回0
  2. setName(“dirty”);
  3. session.save(person);
  4. person.getVersion()-->返回0
  5. session.flush()
  6. person.getVersion()-->返回1
    1.事务提交
    如何在步骤4中获得更新的版本,而无需强制执行会话刷新或事务提交?
    谢谢你!
lmvvr0a8

lmvvr0a81#

很简单:做

person.getVersion() + 1

你笑吗?但这正是hibernate对version属性所做的。
在更新数据库的时候,hibernate从数据库重新加载记录,并将版本值与java对象的版本值进行比较。如果它们相同,那么hibernate将版本值递增1,并将新记录存储到数据库中,如果不相同,则抛出异常。这个想法是,如果任何其他应用程序在此期间修改了记录,修改后的值不能被覆盖,我们的应用程序必须重新加载数据并修改新值。
当然,当java对象中的任何值被修改时,hibernate可以在第一次修改version值。但是每次修改一个值hibernate都要检查对象是否被修改了(新值可以和旧值一样;在这种情况下,不需要更新),并且它必须标记版本值是否已经递增。如果你什么都赢不了为什么还要这么做?
顺便说一下,hibernate不会在保存()的时刻更新数据库记录,而是在flush()或commit()的时刻更新,因为这允许重新排序数据库语句以获得更好的性能。

owfi6suc

owfi6suc2#

别这样!您可以使用存储库来保存数据并使用事务重新注册。这取决于你的上下文!
如果您有几个对数据库具有写访问权限的调用,并且希望在发生错误时回滚它们,那么您必须在操作中使用@Transactional。
但是单个保存操作不需要围绕它的事务,因为存储库按照设计进行事务操作。

相关问题