hibernate - 在非主键 UUID 类型字段上使用 findBy* 方法会导致异常

标签 hibernate grails grails-orm

此问题与 a question I had yesterday 有关.它们听起来像是不同的问题,但我只是想出了我认为的核心问题。我不确定重做最后一个问题是否是最好的做法,所以我只发布了一个单独的问题。

所以,回到问题上来。我有以下域类:

class Person {

    static constraints = {
        key unique: true
    }

    static mapping = {
        key sqlType: 'binary(16)'
    }

    UUID key

}

每当我尝试调用 findByUserId ,我得到以下异常:
org.springframework.dao.InvalidDataAccessResourceUsageException: Cannot query [sample.Person] on non-existent property: key

事实证明,我遇到在旧问题中描述的问题的原因是声明属性唯一意味着在验证期间,GORM 方法 findByUserId被调用。我通过尝试实现一个执行类似操作的自定义 validator 发现了这一点。

现在我的问题是,为什么会发生这种情况,我该怎么办?

当我使用 UUID 类型的身份属性 (id) 时,GORM 方法 get(id) 没有任何问题, 甚至 findById(id) .例如,如果我有下面的域类:
class Person {

    static mapping = {
        id generator: 'assigned', sqlType: 'binary(16)'
    }

    UUID id

    Person() {
        id = UUID.randomUUID()
    }

}

以下测试工作得很好:
given:
Person person = new Person()
person.save()

expect:
Person.get(person.id)
Person.findById(person.id)

最佳答案

您可能需要设置 type (代替或补充 sqlType )。例如,对于 PostgreSQL,它是:

static mapping = {
    id generator: 'assigned', type: 'pg-uuid'
}

关于hibernate - 在非主键 UUID 类型字段上使用 findBy* 方法会导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25939798/

相关文章:

Grails域自引用递归调用

security - Grails Spring Security 插件 - 与用户域一对一关联

java - 在 Hibernate 3 中使用存储过程

java - 复合 id 类的 hashCode() 和 equals() 方法

grails - Grails Spring Security-动态加载 “interceptUrlMap”

spring - Grails AOP 配置异常

events - Grails 2.5 afterUpdate - 它在事务生命周期的哪个点被调用?

Grails 2.1 createCriteria 参数问题

java - Spring Data JPA(MySQL)将String保存为指数形式而不是数字

java - JPA混合继承策略