我有以下场景:1.事务开始
lmvvr0a81#
很简单:做
person.getVersion() + 1
你笑吗?但这正是hibernate对version属性所做的。在更新数据库的时候,hibernate从数据库重新加载记录,并将版本值与java对象的版本值进行比较。如果它们相同,那么hibernate将版本值递增1,并将新记录存储到数据库中,如果不相同,则抛出异常。这个想法是,如果任何其他应用程序在此期间修改了记录,修改后的值不能被覆盖,我们的应用程序必须重新加载数据并修改新值。当然,当java对象中的任何值被修改时,hibernate可以在第一次修改version值。但是每次修改一个值hibernate都要检查对象是否被修改了(新值可以和旧值一样;在这种情况下,不需要更新),并且它必须标记版本值是否已经递增。如果你什么都赢不了为什么还要这么做?顺便说一下,hibernate不会在保存()的时刻更新数据库记录,而是在flush()或commit()的时刻更新,因为这允许重新排序数据库语句以获得更好的性能。
owfi6suc2#
别这样!您可以使用存储库来保存数据并使用事务重新注册。这取决于你的上下文!如果您有几个对数据库具有写访问权限的调用,并且希望在发生错误时回滚它们,那么您必须在操作中使用@Transactional。但是单个保存操作不需要围绕它的事务,因为存储库按照设计进行事务操作。
2条答案
按热度按时间lmvvr0a81#
很简单:做
你笑吗?但这正是hibernate对version属性所做的。
在更新数据库的时候,hibernate从数据库重新加载记录,并将版本值与java对象的版本值进行比较。如果它们相同,那么hibernate将版本值递增1,并将新记录存储到数据库中,如果不相同,则抛出异常。这个想法是,如果任何其他应用程序在此期间修改了记录,修改后的值不能被覆盖,我们的应用程序必须重新加载数据并修改新值。
当然,当java对象中的任何值被修改时,hibernate可以在第一次修改version值。但是每次修改一个值hibernate都要检查对象是否被修改了(新值可以和旧值一样;在这种情况下,不需要更新),并且它必须标记版本值是否已经递增。如果你什么都赢不了为什么还要这么做?
顺便说一下,hibernate不会在保存()的时刻更新数据库记录,而是在flush()或commit()的时刻更新,因为这允许重新排序数据库语句以获得更好的性能。
owfi6suc2#
别这样!您可以使用存储库来保存数据并使用事务重新注册。这取决于你的上下文!
如果您有几个对数据库具有写访问权限的调用,并且希望在发生错误时回滚它们,那么您必须在操作中使用@Transactional。
但是单个保存操作不需要围绕它的事务,因为存储库按照设计进行事务操作。