我正在开发一个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 = "")
?
你可以这样写你自己的策略
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