Contents

Spring Boot 使用 Hibernate 命名策略

1. 简介

在这个简短的教程中,我们将看到如何在Spring Boot 应用程序中使用Hibernate 命名策略

2. Maven依赖

如果我们从一个基于 Maven 的 Spring Boot 应用程序 开始,并且我们很乐意接受 Spring Data,那么我们只需要添加 Spring Data JPA 依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

另外,我们需要一个数据库,所以我们将使用内存数据库 H2

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Spring Data JPA 依赖为我们引入了 Hibernate 依赖。

3. Spring Boot 命名策略

**Hibernate 使用physical-strategyimplicit-strategy映射字段名称。**我们之前在本教程 中讨论过如何使用命名策略。

而且,Spring Boot 为两者提供了默认值:

  • spring.jpa.hibernate.naming.physical-strategy默认为 org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy,并且
  • spring.jpa.hibernate.naming.implicit-strategy默认为 org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy

我们可以覆盖这些值,但默认情况下,它们会:

  • 用下划线替换点
  • 将骆驼案改为蛇案,以及
  • 小写表名

因此,例如,AddressBook实体将被创建为 address_book表。

4. 行动策略

如果我们创建一个 Account实体:

@Entity
public class Account {
    @Id 
    private Long id;
    private String defaultEmail;
}

然后在我们的属性文件中开启一些 SQL 调试:

hibernate.show_sql: true

启动时,我们将 在日志中看到以下create语句:

Hibernate: create table account (id bigint not null, default_email varchar(255))

正如我们所看到的,这些字段使用蛇形大小写并且是小写的,遵循 Spring 约定。

请记住,在这种情况下,我们不需要指定 physical-strategy或 implicit-strategy属性,因为我们接受默认值。

5. 定制策略

因此,假设我们要使用 JPA 1.0 中的策略。

我们只需要在我们的属性文件中指出它:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

或者,将它们公开为*@Bean*:

@Bean
public PhysicalNamingStrategy physical() {
    return new PhysicalNamingStrategyStandardImpl();
}
@Bean
public ImplicitNamingStrategy implicit() {
    return new ImplicitNamingStrategyLegacyJpaImpl();
}

无论哪种方式,如果我们使用这些更改运行我们的示例,我们将看到稍微不同的 DDL 语句:

Hibernate: create table Account (id bigint not null, defaultEmail varchar(255), primary key (id))

正如我们所见,这一次这些策略遵循 JPA 1.0 的命名约定。

现在,如果我们想使用 JPA 2.0 命名规则,我们需要将ImplicitNamingStrategyJpaCompliantImpl设置为我们的隐式策略。