我需要将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
(由于我的低代表,我无法发布更多文档/帖子的链接)
答案 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'
}