【发布时间】:2010-12-10 19:50:59
【问题描述】:
如何重命名HIBERNATE_SEQUENCE?为每个表生成一个序列(并为这些序列指定特定名称)的方法有据可查,但这不是我想要的。
我不介意所有域类共享一个序列。我只需要给它一个特定于应用程序的名称。
【问题讨论】:
标签: grails
如何重命名HIBERNATE_SEQUENCE?为每个表生成一个序列(并为这些序列指定特定名称)的方法有据可查,但这不是我想要的。
我不介意所有域类共享一个序列。我只需要给它一个特定于应用程序的名称。
【问题讨论】:
标签: grails
Hibernate JIRA 中似乎有一个开放功能/增强请求,以使其全局可配置:Make the default sequence name globally configurable。我相信,作为一种解决方法,您必须将每个 @Id 字段的所有域类的“生成器”属性设置为相同的名称(默认为 hibernate_sequence)。见oracle sequence created。
正如您在问题中暗示的那样,可能有一种方法可以通过子类化您的数据库方言来做到这一点 - 正如许多人建议的每表序列方法一样。
【讨论】:
这是我用来设置序列名称的代码。
首先,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);
}
}
接下来,甲骨文方言:
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'
}
【讨论】: