覆盖Grails中的默认序列名称

时间:2010-12-10 19:50:59

标签: grails

如何重命名HIBERNATE_SEQUENCE?每个表生成一个序列的方法(并给出这些序列的特定名称)已有详细记录,但这不是我正在寻找的。我不介意让所有域类共享一个序列 - 我只需要给它一个特定于应用程序的名称。

3 个答案:

答案 0 :(得分:2)

以下是我用来设置序列名称的代码。

首先,SequenceGenerator:

package com.foo;

import java.util.Properties;

import org.hibernate.MappingException;
import org.hibernate.dialect.Dialect;
import org.hibernate.id.SequenceGenerator;
import org.hibernate.type.Type;

public class TableNameSequenceGenerator extends SequenceGenerator {

    public static final String CUSTOM_SEQUENCE_NAME = "MYAPP_SEQUENCE"

    public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
        if(params.getProperty(SEQUENCE) == null || params.getProperty(SEQUENCE).length() == 0) {
            String seqName = CUSTOM_SEQUENCE_NAME;
            params.setProperty(SEQUENCE, seqName);               
        }
        super.configure(type, params, dialect);
    }

}

接下来,OracleDialect:

package com.foo;

import org.hibernate.dialect.Oracle10gDialect;

public class MyAppOracleDialect extends Oracle10gDialect {
    public Class getNativeIdentifierGeneratorClass() {
        return TableNameSequenceGenerator.class;
    }
}

最后,DataSource.groovy需要了解方言:

dataSource {
    pooled = true
    driverClassName = "oracle.jdbc.OracleDriver"
    // username, password....
    dialect='com.foo.MyAppOracleDialect'
}

答案 1 :(得分:1)

Hibernate JIRA中似乎有一个开放的功能/增强请求,以使其全局可配置:Make the default sequence name globally configurable。我相信,作为一种解决方法,您必须为每个@Id字段将'generator'属性设置为所有域类(默认为hibernate_sequence)的相同名称。请参阅oracle sequence created

正如您在问题中暗示的那样,可能有一种方法可以通过继承您的数据库方言来实现这一点 - 正如许多人建议的那样,每个表的序列方法。

请参阅id generator and DRY principle

答案 2 :(得分:0)