Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate &引用;“更新版本控制”;HQL不';不适用于继承的实体(Grails2.5.5)_Hibernate_Grails_Optimistic Locking - Fatal编程技术网

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])
可以工作,但它会随着刚刚创建的子版本的增加而增加<代码>版本化用于批处理,因此不确定该版本是否与实际场景匹配