Hibernate 5 的自定义序列生成器
Custom sequence generator for Hibernate 5
我想在 Hibernate 5 中创建一个自定义序列生成器,以便在 Postgresql 中根据 table 创建一个序列。使用 Hibernate 4 我用我的方言做了以下事情:
/**
* Get the native identifier generator class.
*
* @return TableNameSequenceGenerator.
*/
@Override
Class<?> getNativeIdentifierGeneratorClass() {
TableNameSequenceGenerator
}
/**
* Creates a sequence per table instead of the default behavior of one sequence.
* From <a href='http://www.hibernate.org/296.html'>http://www.hibernate.org/296.html</a>
*/
static class TableNameSequenceGenerator extends SequenceGenerator {
/**
* {@inheritDoc}
* If the parameters do not contain a {@link SequenceGenerator#SEQUENCE} name, we
* assign one based on the table name.
*/
@Override
void configure(final Type type, final Properties params, final Dialect dialect) {
Boolean sequencePerTable = Holders.config.getProperty(SEQUENCE_PER_TABLE, Boolean, true)
if (sequencePerTable) {
if (!params.getProperty(SEQUENCE)) {
String tableName = params.getProperty(TABLE)
String schemaName = params.getProperty('schemaName')
if (schemaName) {
params.setProperty(SCHEMA, schemaName)
}
if (tableName) {
params.setProperty(SEQUENCE, "seq_${tableName}")
}
}
}
super.configure(type, params, dialect)
}
}
我正在尝试迁移到 Hibernate 5,但我不知道如何配置以前的行为。我已将代码修改为从 SequenceStyleGenerator
扩展,因为现在 SequenceGenerator
已被弃用,但我的代码从未执行过。我认为这与 getNativeIdentifierGeneratorClass
方法也已被弃用的事实有关。
我一直在寻找一种创建自定义序列的方法,但我发现的所有示例都专注于使用序列生成器注释我的域 class。我正在寻找的是一种以全局方式定义所有序列的方法。
正如 Graeme 所指出的 (https://github.com/grails/grails-core/issues/10234) 序列的默认名称在 Hibernate 5 中已更改,因此添加
id generator: 'sequence', params: [sequence_name: 'book_seq']
到映射块就可以了。问题是有必要将其添加到 每个 域 class.
我仍在寻找一种方法来全局定义该设置,可能会将每个实体的 prefer_sequence_per_entity
设置为 true。
更新: 最后,我们找到了一种解决方法,可以在全局范围内为每个 table 定义一个序列。只需将以下内容添加到文件 application.groovy
:
grails.gorm.default.mapping = {
id generator: 'org.hibernate.id.enhanced.SequenceStyleGenerator', params: [prefer_sequence_per_entity: true]
}
非常感谢伊万!我只尝试了这个配置,它也有效。
grails.gorm.default.mapping = {
id params: [prefer_sequence_per_entity: true]
}
我想在 Hibernate 5 中创建一个自定义序列生成器,以便在 Postgresql 中根据 table 创建一个序列。使用 Hibernate 4 我用我的方言做了以下事情:
/**
* Get the native identifier generator class.
*
* @return TableNameSequenceGenerator.
*/
@Override
Class<?> getNativeIdentifierGeneratorClass() {
TableNameSequenceGenerator
}
/**
* Creates a sequence per table instead of the default behavior of one sequence.
* From <a href='http://www.hibernate.org/296.html'>http://www.hibernate.org/296.html</a>
*/
static class TableNameSequenceGenerator extends SequenceGenerator {
/**
* {@inheritDoc}
* If the parameters do not contain a {@link SequenceGenerator#SEQUENCE} name, we
* assign one based on the table name.
*/
@Override
void configure(final Type type, final Properties params, final Dialect dialect) {
Boolean sequencePerTable = Holders.config.getProperty(SEQUENCE_PER_TABLE, Boolean, true)
if (sequencePerTable) {
if (!params.getProperty(SEQUENCE)) {
String tableName = params.getProperty(TABLE)
String schemaName = params.getProperty('schemaName')
if (schemaName) {
params.setProperty(SCHEMA, schemaName)
}
if (tableName) {
params.setProperty(SEQUENCE, "seq_${tableName}")
}
}
}
super.configure(type, params, dialect)
}
}
我正在尝试迁移到 Hibernate 5,但我不知道如何配置以前的行为。我已将代码修改为从 SequenceStyleGenerator
扩展,因为现在 SequenceGenerator
已被弃用,但我的代码从未执行过。我认为这与 getNativeIdentifierGeneratorClass
方法也已被弃用的事实有关。
我一直在寻找一种创建自定义序列的方法,但我发现的所有示例都专注于使用序列生成器注释我的域 class。我正在寻找的是一种以全局方式定义所有序列的方法。
正如 Graeme 所指出的 (https://github.com/grails/grails-core/issues/10234) 序列的默认名称在 Hibernate 5 中已更改,因此添加
id generator: 'sequence', params: [sequence_name: 'book_seq']
到映射块就可以了。问题是有必要将其添加到 每个 域 class.
我仍在寻找一种方法来全局定义该设置,可能会将每个实体的 prefer_sequence_per_entity
设置为 true。
更新: 最后,我们找到了一种解决方法,可以在全局范围内为每个 table 定义一个序列。只需将以下内容添加到文件 application.groovy
:
grails.gorm.default.mapping = {
id generator: 'org.hibernate.id.enhanced.SequenceStyleGenerator', params: [prefer_sequence_per_entity: true]
}
非常感谢伊万!我只尝试了这个配置,它也有效。
grails.gorm.default.mapping = {
id params: [prefer_sequence_per_entity: true]
}