grails:db行更新在域类包含'version false'时自动失败

zzlelutf  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(327)

我正在使用grailsv3.2.9
我有一个域类 Offer 包含

static mapping = {
    version false
}

我将一行插入到 offer 表中,然后在另一个事务中,我尝试更新该行中一列的值,但是 offer 当同一事务中的其他实体正确更新时,自动更新失败。
我保存 offer 具体如下:

offer.save(failOnError: true)

所以这不是 offer.save() 当验证失败并且保存失败时。
但是如果我加上 version 列到 offer 表( dbCreate 设置为 none )然后改变主意 Offer 要包含的域类

static mapping = {
    version true
}

行开始成功更新。
当我检查 audit_log 为了 offer 表中只有插入事件,没有任何 update 事件就在那里。
这是非常奇怪的,因为我有其他域类包含 version = false 那里的更新工作很好。
任何帮助都将不胜感激。

chy5wohz

chy5wohz1#

也有可能当您将需要版本的域更改为不需要版本的域时,基础数据库表没有删除该列。
默认情况下,version列在物理数据库中创建为not null。即使hibernate不关心域中的version属性,物理数据库也不会允许插入该记录,因此它会失败。
虽然这解释了为什么不插入记录,但并不能解释为什么不抛出错误。它不应该默默地失败,而是抛出一个sql异常。

wdebmtf2

wdebmtf22#

因为version=false,所以属性offer.version等于null,并且该列在数据库中不存在。通常在执行更新时,hibernate会根据数据库中的version列自动检查version属性。所以,我只是猜测这可能是hibernate会话试图检查空值的错误。我试图复制你的设想,但没有成功。
保存时是否尝试刷新会话?:

offer.save(flush: true, failOnError: true)

相关问题