除非明确指定,否则如何在默认情况下将 Spring Data JPA 从 camelCase 命名为 snake_case?

Posted

技术标签:

【中文标题】除非明确指定,否则如何在默认情况下将 Spring Data JPA 从 camelCase 命名为 snake_case?【英文标题】:How to make Spring Data JPA by default naming from camelCase to snake_case unless explicitly specified? 【发布时间】:2018-11-24 07:17:50 【问题描述】:

默认情况下,我的 Spring Boot 项目通过将名称从 camelCase 转换为 snake_case(例如从 fooBarfoo_bar),将实体属性映射到表列的 JPA。

我正在处理现有数据库,其中实体属性名称与表列名称保持原样(例如从fooBarfooBar),所以我尝试使用@Column 注释来显式指定名称:

@Column(name = "fooBar")
private String fooBar;

这不起作用。我听从了here的建议:

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

我的@Column 现在已成功考虑在内,但我正在失去对没有@Column 注释的属性的camelCase 到snake_case 隐式转换。

知道如何在默认情况下从 camelCase 转换为 snake_case,除非在 @Column 注释中明确指定?

【问题讨论】:

@YCF_L mysql。正如我所说,@Column 现在工作成功,但隐式转换不再是蛇形大小写。 是的,我明白了,只是好奇你为什么要这样? @YCF_L 好吧,我认为 snake_case 对于 SQL 实体(一种非官方约定)更常见,所以我添加的新实体应该是 snake_cased,但我仍然需要处理不支持的旧表不要遵循这个约定。我们将在第二阶段重命名现有表。 【参考方案1】:

从 Hibernate 5 开始,似乎不再支持使用 camelCase(Java 中的命名约定)将属性名称自动转换为 SNAKE_CASE。但是,您可以编写自己的 NamingStrategy 实现,这样做。 请查看this ***-Answer 了解它是如何完成的。

【讨论】:

【参考方案2】:

当我为我的 H2 和 postgres 存储库注入自定义 Spring 数据源 bean 时,不知何故,转换为蛇案例的默认 JPA 行为不起作用。我想在将对象保存到数据库时默认将骆驼案例转换为蛇案例而不显式注释列。因此在 application.properties 添加以下属性对我有用:

spring.jpa.properties.hibernate.physical_naming_strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy

注意:我使用的是spring boot 2.6.2版

【讨论】:

以上是关于除非明确指定,否则如何在默认情况下将 Spring Data JPA 从 camelCase 命名为 snake_case?的主要内容,如果未能解决你的问题,请参考以下文章

Spring 切面优先级

Spring 切面优先级

静态和动态链接库

Groovy - 如何在不更新地图的情况下使用默认值获取地图值

默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段

如何在没有 ObjectId 的情况下将 Mongo 与 Spring Data 一起使用