1. 簡介
在本簡要教程中,我們將學習如何在 Spring Boot 應用程序中使用 Hibernate 命名策略。
2. Maven 依賴
如果我們的項目基於 Maven 構建,並且我們願意採用 Spring Data,那麼我們只需要添加 Spring Data JPA 依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>Spring Data JPA 依賴引入了 Hibernate 依賴。
3. Spring Boot 命名策略
Hibernate 使用 物理策略 和 隱式策略 來映射字段名稱。我們之前在教程中討論過如何使用這些命名策略。
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. 策略實施
如果創建了一個 賬户 實體:
@Entity
public class Account {
@Id
private Long id;
private String defaultEmail;
}然後,請在我們的屬性文件中啓用 SQL 調試:
hibernate.show_sql: true啓動時,我們的日誌中會看到以下語句:
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:
@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 設置為我們的隱式策略。
6. 結論
在本教程中,我們看到了 Spring Boot 如何將命名策略應用於 Hibernate 的查詢生成器,並且我們還看到了如何自定義這些策略。