我正在使用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
那里的更新工作很好。
任何帮助都将不胜感激。
2条答案
按热度按时间chy5wohz1#
也有可能当您将需要版本的域更改为不需要版本的域时,基础数据库表没有删除该列。
默认情况下,version列在物理数据库中创建为not null。即使hibernate不关心域中的version属性,物理数据库也不会允许插入该记录,因此它会失败。
虽然这解释了为什么不插入记录,但并不能解释为什么不抛出错误。它不应该默默地失败,而是抛出一个sql异常。
wdebmtf22#
因为version=false,所以属性offer.version等于null,并且该列在数据库中不存在。通常在执行更新时,hibernate会根据数据库中的version列自动检查version属性。所以,我只是猜测这可能是hibernate会话试图检查空值的错误。我试图复制你的设想,但没有成功。
保存时是否尝试刷新会话?: