gpt4 book ai didi

hibernate - Hibernate OptimisticLockingFailureException应该不会抛出

转载 作者:行者123 更新时间:2023-12-02 14:53:05 24 4
gpt4 key购买 nike

假设我有以下域类:

class Book {
String name
// more properties here, but name is the only one relevant for this example
}

我想通过 View 更新其名称。我正在使用以下表单进行更新:
<g:form action="updateName" id="${book.id}">
<g:hiddenField name="version"/>
<g:textField name="name"/>
...
</g:form>

在 Controller 中,我使用以下逻辑:
def updateName() {
println("IN UPDATENAME()")
def book = Book.get(params.id)
println("VERSION BEFORE ASSIGN: ${book.version})
book.version = params.long('version')
println("VERSION AFTER ASSIGN: ${book.version})
book.name = params.name
book.save(flush: true)
...
}

我通过在2种不同的浏览器中打开相同的编辑页面进行测试。我在一个浏览器中执行 updateName,然后在另一个浏览器中执行。第二个 updateName应该抛出一个 OptimisticLockingFailureException,但是不是。

我启用了SQL输出,这是我在日志中得到的:
IN UPDATENAME()
VERSION BEFORE ASSIGN: 0
VERSION AFTER ASSIGN: 0
update book set version=?, name=? where id=? and version=?
binding parameter [1] as [BIGINT] - 1
binding parameter [2] as [STRING] - 'abc123'
binding parameter [3] as [BIGINT] - 1
binding parameter [4] as [BIGINT] - 0

IN UPDATENAME()
VERSION BEFORE ASSIGN: 1
VERSION AFTER ASSIGN: 0
update book set version=?, name=? where id=? and version=?
binding parameter [1] as [BIGINT] - 1
binding parameter [2] as [STRING] - 'def456'
binding parameter [3] as [BIGINT] - 1
binding parameter [4] as [BIGINT] - 1

换句话说,在第二个调用中,我能够成功地将版本从1分配给0,这应该引起了异常,但是由于某种原因,SQL调用仍然错误地检查了version = 1而不是0。知道为什么会这样吗?

最佳答案

version是域类的属性(而不是字段),它实际上定义为访问器方法getVersion()version中未定义DefaultGrailsDomainClass设置程序。

同样在脚手架 Controller 的情况下,尽管检查/验证是手动完成的,但是没有手动设置version属性的地方。当 session flush遇到版本不匹配时,休眠将在 session 中使用乐观锁定,并且仅当第二个用户是脏读的受害者时才会发生不匹配。

在您的情况下,要么必须通过手动验证版本来获取支架式 Controller 逻辑,要么必须依靠Hibernate来完成其工作,而不是手动操作版本,这是不可行的。

关于hibernate - Hibernate OptimisticLockingFailureException应该不会抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18626757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com