如何配置Grails id列以在Oracle上使用UUID?

时间:2013-11-25 22:47:16

标签: oracle grails gorm uuid uniqueidentifier

我想在我的所有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)。

似乎有许多与此相关的问题,但没有一个提供实际有效的完整,准确和最新的答案。

相关问题

2 个答案:

答案 0 :(得分:11)

使用UUID和RAW(16)

如果您想在Grails域中使用UUID并在数据库中使用RAW(16),则需要添加以下内容。

  1. 对于每个域,请指定id字段。以下是使用ExampleDomain.groovy

    的示例
    class ExampleDomain {
        UUID id
    }
    
  2. 将以下映射添加到Config.groovy

    grails.gorm.default.mapping = {
        id(generator: "uuid2", type: "uuid-binary", length: 16)
    }
    

    有关我选择的三个值的详细信息,请参阅这些链接。

  3. 将自定义方言添加到Datasource.groovy中的数据源条目。如果您使用的是Hibernate 4.0.0.CR5或更高版本,则可以跳过此步骤。

    dataSource {
        // Other configuration values removed for brevity
        dialect = com.example.hibernate.dialect.BinaryAwareOracle10gDialect
    }
    
  4. 实现您在步骤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

  5. 使用UUID和VARCHAR2(36)

    如果您想在Grails域中使用UUID并在数据库中使用VARCHAR2(36),则需要添加以下内容。

    1. 对于每个域,请指定id字段。以下是使用ExampleDomain.groovy的示例。

      class ExampleDomain {
          UUID id
      }
      
    2. 将以下映射添加到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'
}