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-strategy和implicit-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设置为我们的隐式策略。