Hibernate 5的自定义序列生成器

3

我希望在Hibernate 5中创建一个自定义的序列生成器,以在Postgresql中为每个表创建一个序列。 在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)
    }
}

您可以在此处查看完整代码:https://github.com/kaleidos/grails-postgresql-extensions/blob/master/src/main/groovy/net/kaleidos/hibernate/PostgresqlExtensionsDialect.groovy#L53 我正在尝试迁移到Hibernate 5,但不知道如何配置以前的行为。我已修改了代码以扩展自SequenceStyleGenerator,因为现在SequenceGenerator已被弃用,但我的代码从未执行。我认为这与方法getNativeIdentifierGeneratorClass也被弃用有关。
我一直在寻找一种创建自定义序列的方法,但我发现的所有示例都集中在使用序列生成器注释我的域类上。我要寻找的是以全局方式定义所有序列的方法。

spring.jpa.hibernate.use-new-id-generator-mappings: true config is required in application.yml in order to use SequenceStyleGenerator - dmahapatro
顺便提一下,getNativeIdentifierGeneratorClass() 可以被替换为 getNativeIdentifierGeneratorStrategy(),它返回一个 String - dmahapatro
use-new-id-generator-mappings 在 Grails 应用程序中可能无法工作,因为它是特定于 Spring Data JPA 的。 - dmahapatro
2个回答

3

正如Graeme所指出的那样 (https://github.com/grails/grails-core/issues/10234),Hibernate 5中序列的默认名称已更改,因此添加以下内容:

id generator: 'sequence', params: [sequence_name: 'book_seq']

到映射块即可解决问题。但问题是需要将此内容添加到每个领域类。

我仍在寻找一种在全局范围内定义该设置的方法,也许可以为每个实体将prefer_sequence_per_entity设置为true。

更新:最终,我们发现了一种全局定义表格序列的解决方法。只需在文件application.groovy中添加以下内容:

grails.gorm.default.mapping = {
    id generator: 'org.hibernate.id.enhanced.SequenceStyleGenerator', params: [prefer_sequence_per_entity: true]
}

1
非常感谢Ivan!我尝试了这个配置,也起作用了。
 grails.gorm.default.mapping = {
      id  params: [prefer_sequence_per_entity: true]
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接