Spring 启动应用程序和休眠使用不同的命名策略
Spring boot application and hibernate are using different naming strategies
这很奇怪。
我正在使用 spring.jpa.generate-ddl=true 在我的数据库中创建 tables。当 spring 这样做时,table 名称是蛇形的。
例如,MyClass
的 table 变为 my_class
。
接下来,我使用以下代码从 Hibernate 导出架构:
Export schema from Hibernate
当我调用代码时,生成的 sql 具有 table 首字母大写的驼峰式名称。因此,MyClass
的 table 是 MyClass
.
为什么他们会产生不同的东西?
如何让它们相同?
table 名称不同,因为 Spring 配置 Hibernate 使用不同的命名策略。命名策略定义了 Hibernate 如何生成属性或实体的逻辑名称以及如何将它们映射到数据库中的物理名称。我在 Naming Strategy Guide on my blog.
中对此进行了更详细的解释
您有多个选项来确保您的两个设置使用相同的命名策略:
如果您使用的是 >= 5.5.4 的 Hibernate 版本,您可以将其配置为使用 CamelCaseToUnderscoresNamingStrategy
。这是 Spring 默认使用的那个:
<persistence>
<persistence-unit name="my-persistence-unit">
...
<properties>
...
<property name="hibernate.physical_naming_strategy"
value="org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"/>
</properties>
</persistence-unit>
</persistence>
如果您使用的是较旧的 Hibernate 版本,您可能希望将 Spring 的命名策略更改为 Hibernate 的默认策略。您可以通过在 application.properties 文件中设置以下 属性 来做到这一点:
spring.jpa.properties.hibernate.implicit_naming_strategy=default
如果您使用的是较旧的 Hibernate 版本并希望使用 Spring 的命名策略,则必须实施自定义命名策略。这并不复杂,我在 my blog post 中解释了如何操作,但我会选择前面提到的解决方案之一。
这很奇怪。
我正在使用 spring.jpa.generate-ddl=true 在我的数据库中创建 tables。当 spring 这样做时,table 名称是蛇形的。
例如,MyClass
的 table 变为 my_class
。
接下来,我使用以下代码从 Hibernate 导出架构: Export schema from Hibernate
当我调用代码时,生成的 sql 具有 table 首字母大写的驼峰式名称。因此,MyClass
的 table 是 MyClass
.
为什么他们会产生不同的东西? 如何让它们相同?
table 名称不同,因为 Spring 配置 Hibernate 使用不同的命名策略。命名策略定义了 Hibernate 如何生成属性或实体的逻辑名称以及如何将它们映射到数据库中的物理名称。我在 Naming Strategy Guide on my blog.
中对此进行了更详细的解释您有多个选项来确保您的两个设置使用相同的命名策略:
如果您使用的是 >= 5.5.4 的 Hibernate 版本,您可以将其配置为使用 CamelCaseToUnderscoresNamingStrategy
。这是 Spring 默认使用的那个:
<persistence>
<persistence-unit name="my-persistence-unit">
...
<properties>
...
<property name="hibernate.physical_naming_strategy"
value="org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"/>
</properties>
</persistence-unit>
</persistence>
如果您使用的是较旧的 Hibernate 版本,您可能希望将 Spring 的命名策略更改为 Hibernate 的默认策略。您可以通过在 application.properties 文件中设置以下 属性 来做到这一点:
spring.jpa.properties.hibernate.implicit_naming_strategy=default
如果您使用的是较旧的 Hibernate 版本并希望使用 Spring 的命名策略,则必须实施自定义命名策略。这并不复杂,我在 my blog post 中解释了如何操作,但我会选择前面提到的解决方案之一。