编程语言
首页 > 编程语言> > java-Hibernate 5的自定义序列生成器

java-Hibernate 5的自定义序列生成器

作者:互联网

我想在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也已被弃用.

我一直在寻找一种创建自定义序列的方法,但是我发现的所有示例都集中在用序列生成器注释域类.我正在寻找的是一种以全局方式定义所有序列的方法.

解决方法:

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

id生成器:​​“序列”,参数:[sequence_name:’book_seq’]

映射块就可以了.问题是有必要将其添加到每个域类中.

我仍在寻找一种全局定义该设置的方法,也许为每个实体将preferred_sequence_per_entity设置为true.

更新:最后,我们找到了一种解决方法,可以全局定义每个表的序列.只需将以下内容添加到文件application.groovy中:

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

标签:postgresql,hibernate,grails,hibernate-5-x,java
来源: https://codeday.me/bug/20191026/1937384.html