我有以下情况:
在不实际强制进行会话刷新或事务提交的情况下,如何在步骤4中获取更新版本?
谢谢!
答案 0 :(得分:3)
非常简单:
person.getVersion() + 1
你笑了吗?但正是这正是hibernate使用版本属性所做的。
在更新到数据库的那一刻,hibernate从数据库重新加载记录,并将版本值与java对象的版本值进行比较。如果它们相同,则hibernate将版本值增加1并将新记录存储到数据库中,否则会引发异常。这个想法是,如果任何其他应用程序在此期间修改了记录,则不得覆盖修改后的值,并且我们的应用程序必须重新加载数据并修改新值。
当修改java对象中的任何值时,确定hibernate可以第一次修改版本值。但是每次修改一个值时,hibernate都必须检查对象是否被修改(新值可以与旧值相同;在这种情况下不需要更新),并且必须标记版本值是否已经是递增与否。为什么这样做,如果你没有赢得任何东西?
顺便说一句,hibernate不会在save()的瞬间更新数据库记录,而是在flush()或commit()的时刻,因为这允许重新排序数据库语句以获得更好的性能