【问题标题】:Custom sequence generator for Hibernate 5Hibernate 5 的自定义序列生成器
【发布时间】:2023-03-31 09:54:01
【问题描述】:

我想在 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: trueapplication.yml 中需要配置才能使用SequenceStyleGenerator
  • 附带说明,getNativeIdentifierGeneratorClass() 可以替换为 getNativeIdentifierGeneratorStrategy(),它返回 String
  • use-new-id-generator-mappings 可能无法在 Grails 应用程序中运行,因为它特定于 spring data jpa。

标签: java postgresql hibernate grails hibernate-5.x


【解决方案1】:

正如 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]
}

【讨论】:

    【解决方案2】:

    非常感谢伊万!我只尝试了这种配置,它也有效。

     grails.gorm.default.mapping = {
          id  params: [prefer_sequence_per_entity: true]
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2016-12-15
      相关资源
      最近更新 更多