我正在使用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
的域类,并且在那里进行更新就可以了。
任何帮助将不胜感激。
答案 0 :(得分:0)
由于版本=假,所以属性Offer.version等于null,并且该列在数据库中不存在。通常,在执行更新时,Hibernate会根据数据库中的version列自动检查version属性。因此,我只是猜测休眠会话尝试检查一个空值可能是一个错误。我试图复制您的方案,但没有成功。
保存时是否尝试刷新会话?
offer.save(flush: true, failOnError: true)
答案 1 :(得分:0)
当您将需要版本的域更改为不需要版本的域时,基础数据库表也不会删除该列。
默认情况下,物理数据库中的version列创建为NOT NULL。即使休眠不关心域中的版本属性,物理数据库也不会插入该记录,因此它会失败。
虽然这解释了为什么不插入记录的原因,但没有解释为什么不引发错误的原因。它不应静默失败,而应引发SQL异常。