Spring Data JPA Snake_case(表名+列名)

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

我正在开发一个SpringBoot项目,在生成数据库模式时,我需要确保表名位于snake_case格式的列名之前。

例如下面的实体类

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    private UUID id;
    private String email;
    private String password;
    private LocalDateTime createdAt;
}

必须转换为包含以下列的

user
表:

  • 用户 ID

  • 用户电子邮件

  • 用户密码

  • 用户创建于

目前,我正在使用以下属性将 CamleCase 字段转换为 Snake_case 列:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy

因此

createdAt
字段已成功转换为
created_at
,但我要求将其转换为
user_created_at

有什么方法可以自动转换它而不在每个字段上使用

@Column(name = "")

java spring-boot hibernate jpa spring-data-jpa
1个回答
0
投票

你可以这样写你自己的策略

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);
    }
}

然后添加这个

hibernate.physical_naming_strategy= address of above custom strategy
© www.soinside.com 2019 - 2024. All rights reserved.