在grails / hibernate中使用uuid或guid作为id

时间:2014-05-19 11:08:49

标签: hibernate grails groovy hibernate-mapping

我需要将GUID / UUID作为行的id列。

这是为了能够在线和离线创建条目,当然在合并时不会在PK上产生这些冲突。我知道我可以缓解这一点,但我想保持简单,并且已经有使用uuid / guids来定义关系的遗留应用程序。数据也需要稍后同步。不能重写现有的应用程序。

当我尝试使用带有grails的GUID或UUID时,我收到错误500.(在h2上使用GUID会导致另一个错误 - 拒绝该数据库不支持GUID,如预期的那样)。

当我尝试保存'WithUUID'时出现此错误:

URI    /gtestUUID/withUUID/save
Class    java.lang.IllegalArgumentException
Message    argument type mismatch

整个错误500: http://imgur.com/m2Udbm6.png

我尝试过使用mariadb 5.5和1.1.7驱动程序,这会导致同样的问题。

Grails 2.3.8。 Windows 8.1(x64)。 Netbeans 7.4

全部默认。

示例类:

WithUUID.groovy:

package gtestuuid

class WithUUID {
    String name
    static constraints = {
    }
    static mapping = {
        id generator: 'uuid'
    }
}

WithUUIDController.groovy:

package gtestuuid

class WithUUIDController {
    def scaffold = WithUUID
}

非常感谢任何帮助。

Link to relevant grails documentation

(由于我的低代表,我无法发布更多文档/帖子的链接)

4 个答案:

答案 0 :(得分:9)

您需要将id设置为String或UUID(或任何您需要的)。

下面是我的班级用户的另一种可能性的例子:

import java.util.UUID

class User {

    String id = UUID.randomUUID().toString()

    static mapping = {
        id generator:'assigned'
    }
}

答案 1 :(得分:9)

或者您可以在类中指定UUID id字段,而无需像本例中那样进行任何初始化和设置映射

class Buyer {

    UUID id
    String name
    String phone
    String email

    static constraints = {
    }

    static mapping = {
        id generator : 'uuid2', type: 'pg-uuid' // pg-uuid because I use postgresql
    }

}

您可以在Config.groovy

中取出映射
grails.gorm.default.mapping = {
    id generator : 'uuid2', type: 'pg-uuid'
}

并且您的类将仅包含UUID id字段,而不包含任何还原代码

答案 2 :(得分:0)

这是我在Grails 3域类中所做的...

class MyClass {    
    static constraints = {
    }

    UUID id
    static mapping = {
        id generator: "UuidGenerator", length: 36, type: "uuid-char"

   }


}

然后就是我在UuidGenerator.groovy里面的内容

import org.hibernate.id.IdentifierGenerator;
import  org.hibernate.engine.spi.SessionImplementor

import java.security.SecureRandom;

/**
 * 
 */
class UuidGenerator implements IdentifierGenerator {
    Serializable generate(SessionImplementor session, Object object) {

        UUID.randomUUID()
    }
}

对于grails 2.x.x,我的UuidGenerator.groovy看起来像这样......

import org.grails.datastore.mapping.core.SessionImplementor
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.engine.SessionImplementor;


/**
 * 
 */
class UuidGenerator implements IdentifierGenerator {
    Serializable generate(SessionImplementor session, Object object) {

        return UUID.randomUUID().toString()
    }
}

我的域类看起来像这样......

class MyClass {    
    static constraints = {

    }

     String id 
    static mapping = {
        id generator: "com.novadge.UuidGenerator", length:36
    }    
}

答案 3 :(得分:0)

如果将id指定为String且生成器类型为“ uuid”,则在Grails 3中轻松获得域的uuid行为。

class State  {
    String id
    String state 

    static mapping = {
        id generator: 'uuid'
    }