我想在我的所有Grails域上使用128位UUID
而不是Long
作为id字段。我宁愿不必在每个域上指定所有映射信息。有一种简单的方法可以通用/全局方式实现这一目标吗?我使用的是Grails 2.3.x,Hibernate 3.6.10.2插件,Database Migration Plugin 1.3.8和Oracle 11g(11.2.0.2.0)。
似乎有许多与此相关的问题,但没有一个提供实际有效的完整,准确和最新的答案。
相关问题
答案 0 :(得分:11)
如果您想在Grails域中使用UUID
并在数据库中使用RAW(16)
,则需要添加以下内容。
对于每个域,请指定id字段。以下是使用ExampleDomain.groovy
class ExampleDomain {
UUID id
}
将以下映射添加到Config.groovy
grails.gorm.default.mapping = {
id(generator: "uuid2", type: "uuid-binary", length: 16)
}
有关我选择的三个值的详细信息,请参阅这些链接。
将自定义方言添加到Datasource.groovy
中的数据源条目。如果您使用的是Hibernate 4.0.0.CR5或更高版本,则可以跳过此步骤。
dataSource {
// Other configuration values removed for brevity
dialect = com.example.hibernate.dialect.BinaryAwareOracle10gDialect
}
实现您在步骤3中引用的自定义方言。这是用Java实现的BinaryAwareOracle10gDialect
。如果您使用的是Hibernate 4.0.0.CR5或更高版本,则可以跳过此步骤。
package com.example.hibernate.dialect;
import java.sql.Types;
import org.hibernate.dialect.Oracle10gDialect;
public class BinaryAwareOracle10gDialect extends Oracle10gDialect {
@Override
protected void registerLargeObjectTypeMappings() {
super.registerLargeObjectTypeMappings();
registerColumnType(Types.BINARY, 2000, "raw($l)");
registerColumnType(Types.BINARY, "long raw");
}
}
有关此更改的详细信息,请参阅相关的Hibernate缺陷https://hibernate.atlassian.net/browse/HHH-6188。
如果您想在Grails域中使用UUID
并在数据库中使用VARCHAR2(36)
,则需要添加以下内容。
对于每个域,请指定id字段。以下是使用ExampleDomain.groovy
的示例。
class ExampleDomain {
UUID id
}
将以下映射添加到Config.groovy
grails.gorm.default.mapping = {
id(generator: "uuid2", type: "uuid-char", length: 36)
}
有关这三个值的详细信息,请参阅上一节中步骤2中的链接。
答案 1 :(得分:0)
我认为有一种简单的方法:
String id = UUID.randomUUID().toString()
static mapping = {
id generator:'assigned'
}