Java Spring Boot 和 Hibernate 6 中的自定义序列名称策略

问题描述 投票:0回答:1

Hibernate 6 对序列的命名策略是添加后缀:_SEQ

如何将后缀从 _SEQ 改为 $SEQ?

我创建了一个自定义命名策略来添加 $SEQ 后缀,因此序列名称将为 $SEQ。

public class CustomImplicitDatabaseObjectNamingStrategy
    implements ImplicitDatabaseObjectNamingStrategy {
  public static final String STRATEGY_NAME = "custom";

  @Override
  public QualifiedName determineSequenceName(
      Identifier catalogName,
      Identifier shemaName,
      Map<?, ?> configValues,
      ServiceRegistry serviceRegistry) {
    final JdbcEnvironment jdbcEnvironment = serviceRegistry.getService(JdbcEnvironment.class);

    String entityName = (String) configValues.get("jpa_entity_name");
    String seqName = entityName + "$SEQ";
    System.out.println("seqName " + seqName);

    return new QualifiedSequenceName(
        catalogName, shemaName, jdbcEnvironment.getIdentifierHelper().toIdentifier(seqName, false));
  }

  @Override
  public QualifiedName determineTableName(
      Identifier catalogName,
      Identifier schemaName,
      Map<?, ?> configValues,
      ServiceRegistry serviceRegistry) {

    return null;
  }
}

此自定义命名策略在属性中引用:

spring.jpa.properties.hibernate.id.db_structure_naming_strategy

Hibernate 6 的默认增量步长为 50,但我的数据库序列只有 1。因此我尝试更改它:

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "my_entity_seq")
  @SequenceGenerator(name = "my_entity_seq", allocationSize = 1)
  @Column(name = "id")
  Long id;

它不起作用,因为序列名称中添加了引号: 选择“MyEntityName$SEQ”.nextval

如何防止添加引号? 或者有更好的方法改变后缀吗?

java spring hibernate
1个回答
0
投票

您必须在 Hibernate 中使用自定义序列生成器。

修改为:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "custom_generator")
@GenericGenerator(name = "custom_gen", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
       parameters = {
                @Parameter(name = SequenceStyleGenerator.CONFIG_SEQUENCE_PER_ENTITY_SUFFIX, value = "$seq"),
                @Parameter(name = SequenceStyleGenerator.INITIAL_PARAM, value = "1"),
                @Parameter(name = SequenceStyleGenerator.INCREMENT_PARAM, value = "1")})
@Column(name = "id")
Long id;

看看这是否有帮助

© www.soinside.com 2019 - 2024. All rights reserved.