Hibernate &引用;“更新版本控制”;HQL不';不适用于继承的实体(Grails2.5.5)
我想对我的项目中的一些层次实体使用Hibernate &引用;“更新版本控制”;HQL不';不适用于继承的实体(Grails2.5.5),hibernate,grails,optimistic-locking,Hibernate,Grails,Optimistic Locking,我想对我的项目中的一些层次实体使用updateversionedHQL查询。原因是我想在一个查询中更新很多行,但我也希望乐观锁定机制能够工作 我准备了一个小例子,可以很容易地重现这个问题。我正在使用Grails2.5.5 我的域类: abstract class Parent { String name static mapping = { tablePerHierarchy false } } class Child extends Parent
updateversioned
HQL查询。原因是我想在一个查询中更新很多行,但我也希望乐观锁定机制能够工作
我准备了一个小例子,可以很容易地重现这个问题。我正在使用Grails2.5.5
我的域类:
abstract class Parent {
String name
static mapping = {
tablePerHierarchy false
}
}
class Child extends Parent {}
我的测试:
final def entity = new Child(name: 'Test').save()
final def version = entity.version
Parent.executeUpdate(
'UPDATE VERSIONED Parent p SET p.name = :val WHERE p.id IN (:ids)',
[ids: [entity.id], val: 'Updated value']
)
assertEquals(version + 1, entity.refresh().version)
H2数据库的例外情况:
Hibernate operation: could not prepare statement; bad SQL grammar [update parent set parent0_.version=parent0_.version+1, name=? where (id) IN (select id from HT_parent)]; nested exception is org.h2.jdbc.JdbcSQLException: Table "PARENT0_" not found; SQL statement:
update parent set parent0_.version=parent0_.version+1, name=? where (id) IN (select id from HT_parent) [42102-176]
对于Postgres,我也有类似的例外,这也清楚地表明生成的SQL查询是错误的
以下是您可以自己尝试代码的沙箱:
我怀疑这不是Grails/GORM的问题,但Hibernate本身不允许我这样做
目前我切换到纯SQL并显式增加版本。这对我来说很有效,但如果有人有同样的问题,我只是好奇。也许你能告诉我比我发现的更好的解决方法。或者也许我一开始就不想要这种行为?:)
毕竟,我想知道为什么它不起作用?它是否与update HQL查询中禁止的隐式连接有关
提前感谢你的帮助 @vahid对不起,我不太清楚你的解决方案。回答您的问题:“当您创建子级时,考虑到每个层次结构的表为false,父级是否会自动注册新条目,然后所有内容都已包含在一个表中?”-否,共有两个表:父级和子级。很抱歉,删除了我的注释,因为它们没有用处。我认为您的注释是正确的,根据此处。总之,我通过将其调整为
Parent.executeUpdate('updateparent p SET version=:version,p.name=:val,其中p.id位于(:ids);[ids:[entity.id],val:'Updated value',version:version+1])
可以工作,但它会随着刚刚创建的子版本的增加而增加<代码>版本化用于批处理,因此不确定该版本是否与实际版本匹配scenario@vahid对不起,我不太清楚你的解决方案。回答您的问题:“当您创建子级时,考虑到每个层次结构的表为false,父级是否会自动注册新条目,然后所有内容都已包含在一个表中?”-否,共有两个表:父级和子级。很抱歉,删除了我的注释,因为它们没有用处。我认为您的注释是正确的,根据此处。总之,我通过将其调整为Parent.executeUpdate('updateparent p SET version=:version,p.name=:val,其中p.id位于(:ids);[ids:[entity.id],val:'Updated value',version:version+1])
可以工作,但它会随着刚刚创建的子版本的增加而增加<代码>版本化用于批处理,因此不确定该版本是否与实际场景匹配