Grails:当域类包含“ version false”时,db行更新默默失败

时间:2018-09-26 16:08:49

标签: mysql database grails sql-update version

我正在使用grails v3.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的域类,并且在那里进行更新就可以了。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

由于版本=假,所以属性Offer.version等于null,并且该列在数据库中不存在。通常,在执行更新时,Hibernate会根据数据库中的version列自动检查version属性。因此,我只是猜测休眠会话尝试检查一个空值可能是一个错误。我试图复制您的方案,但没有成功。

保存时是否尝试刷新会话?

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

答案 1 :(得分:0)

当您将需要版本的域更改为不需要版本的域时,基础数据库表也不会删除该列。

默认情况下,物理数据库中的version列创建为NOT NULL。即使休眠不关心域中的版本属性,物理数据库也不会插入该记录,因此它会失败。

虽然这解释了为什么不插入记录的原因,但没有解释为什么不引发错误的原因。它不应静默失败,而应引发SQL异常。