【问题标题】:Naming strategy of columns in spring boot 2spring boot 2中列的命名策略
【发布时间】:2020-03-18 20:59:43
【问题描述】:

如果没有在@Column 中明确定义,我如何配置 spring 在列中使用下划线?例如,如果我在这样的实体中有列:

@LastModifiedBy
private String changedBy;

我想将它映射到数据库中的物理列changed_by

我尝试使用属性 spring.jpa.hibernate.naming.physical-strategy 将其配置为 SpringPhysicalNamingStrategyPhysicalNamingStrategyStandardImpl 但我总是遇到异常 ERROR: column "changedby" of relation "xxxx" does not exist

【问题讨论】:

标签: spring hibernate spring-boot jpa spring-data-jpa


【解决方案1】:

您可以使用@Column 手动指定列的名称:

     @LastModifiedBy
     @Column(name="changed_by")
     private String changedBy;

【讨论】:

  • 我知道,但我想避免它,因为我会在整个应用程序中更改它。在启动 1.5 中,我们自动将骆驼案例映射到蛇
【解决方案2】:

您可以使用custom naming for snake case

我们可以告诉 Hibernate 使用我们的新策略:

hibernate.physical_naming_strategy=com.baeldung.hibernate.namingstrategy.CustomPhysicalNamingStrategy

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {     
    @Override
    public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }     
    @Override
    public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }     
    @Override
    public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }     
    @Override
    public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }     
    @Override
    public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }     
    private Identifier convertToSnakeCase(final Identifier identifier) {
        final String regex = "([a-z])([A-Z])";
        final String replacement = "$1_$2";
        final String newName = identifier.getText()
          .replaceAll(regex, replacement)
          .toLowerCase();
        return Identifier.toIdentifier(newName);
    }
}

【讨论】:

  • 不适用于我.. 我不明白。我也将它创建为 bean 并将其标记为主要,但是当我在调试模式下运行时,我的断点在不同的策略实现中被命中
  • @DenisStephanov 你使用 application.properties 吗?是否有单行hibernate.physical_naming_strategy
  • 不要忘记更新 application.properties 以指向新类:spring.jpa.hibernate.naming.physical-strategy=path.to.package.CustomPhysicalNamingStrategy
【解决方案3】:

在我的设置(PostgresFlyway)中,我使用 hybernate-types 包实现了这一点:https://github.com/vladmihalcea/hibernate-types。这将为您提供一个现成的命名策略实现:CamelCaseToSnakeCaseNamingStrategy

您可以像这样在 XML 中进行配置:

<property name="hibernate.physical_naming_strategy"
value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"/>

或者,您可以在代码中配置它(在我的例子中是 Kotlin):


@Bean
fun entityManagerFactory(): LocalContainerEntityManagerFactoryBean {
    val jpaProperties = Properties().apply {
        put("hibernate.physical_naming_strategy", CamelCaseToSnakeCaseNamingStrategy::class.java.canonicalName)
        // ....
    }
    return LocalContainerEntityManagerFactoryBean().apply {
        setJpaProperties(properties)
        // ....
    }

有关详细信息,另请参阅https://vladmihalcea.com/map-camel-case-properties-snake-case-column-names-hibernate/

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2019-07-05
    • 2020-02-02
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多