繁体   English   中英

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

[英]Grails: Db row update fails silently when domain class contains 'version false'

我正在使用Grails v3.2.9

我有一个域类Offer包含

static mapping = {
    version false
}

我在offer表中插入一行,然后在另一笔交易中,我尝试更新该行中一列的值,但是当同一笔交易中的其他实体正确更新时, offer更新默默地失败了。

我将offer保存如下:

offer.save(failOnError: true)

因此,当验证失败并且保存失败时, offer.save()并非如此。

但是,如果我添加versionoffer表( dbCreate设置为none ),并更改Offer域类包含

static mapping = {
    version true
}

该行开始成功更新。

当我检查offer表的audit_log ,只有插入事件,没有任何update事件。

这很奇怪,因为我还有其他包含version = false域类,并且在那里更新正常。

任何帮助,将不胜感激。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM