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

jst*_*ker 3 oracle grails uuid uniqueidentifier grails-orm

我想在我的所有Grails域上使用128位UUID而不是Longid字段.我宁愿不必在每个域上指定所有映射信息.有一种简单的方法可以通用/全局方式实现这一目标吗?我使用的是Grails 2.3.x,Hibernate 3.6.10.2插件,Database Migration Plugin 1.3.8和Oracle 11g(11.2.0.2.0).

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

相关问题

jst*_*ker 11

使用UUID和RAW(16)

如果要UUID在Grails域和RAW(16)数据库中使用a ,则需要添加以下内容.

  1. 对于每个域,请指定id字段.这是一个使用的例子ExampleDomain.groovy

    class ExampleDomain {
        UUID id
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加以下映射到 Config.groovy

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

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

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

    dataSource {
        // Other configuration values removed for brevity
        dialect = com.example.hibernate.dialect.BinaryAwareOracle10gDialect
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 实现您在步骤3中引用的自定义方言.这是BinaryAwareOracle10gDialect用Java实现的.如果您使用的是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");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    有关此更改的更多信息,请参阅相关的Hibernate缺陷https://hibernate.atlassian.net/browse/HHH-6188.

使用UUID和VARCHAR2(36)

如果要UUID在Grails域和VARCHAR2(36)数据库中使用a ,则需要添加以下内容.

  1. 对于每个域,请指定id字段.这是一个使用的例子ExampleDomain.groovy.

    class ExampleDomain {
        UUID id
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加以下映射到 Config.groovy

    grails.gorm.default.mapping = {
        id(generator: "uuid2", type: "uuid-char", length: 36)
    }
    
    Run Code Online (Sandbox Code Playgroud)

    有关这三个值的详细信息,请参阅上一节中步骤2中的链接.