版本
spring-boot:3.2.2 hibernate:6.4.1.Final
配置项目
DDL模式
生成定义语句修改表结构
- 配置路径:spring.jpa.hibernate.ddl-auto
- 配置值:org.hibernate.tool.schema.Action枚举类型值
可选值:
可选值 | 说明 |
---|---|
none | 默认值。不操作 |
create-only | 当使用嵌入式数据库且没有模式管理器时,此项为默认值。创建,如果已存在将报错 |
drop | 删除 |
create | 删除后再创建 |
create-drop | 先删除,SessionFactory启动时创建,SessionFactory关闭时再删除 |
validate | 仅校验 |
update | 必要时更新 |
truncate | 清空数据 |
隐式命名策略
如果没有通过@Table或者@Column等注解显式指定表名、列名,将通过隐式命名策略生成对应名称
- 配置路径: spring.jpa.hibernate.naming.implicit-strategy
- 配置值:指定实现 org.hibernate.boot.model.naming.ImplicitNamingStrategy 接口的类全名
- 默认值: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
可选官方实现:
类名 | 说明 |
---|---|
org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl | 匹配JPA2.0标准的实现,使用JPA注解指派的名称或者根据类名属性名。其他实现都继承于此类。 |
org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy | 默认值。重写了关联连接表名规则 |
org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl | 重写了 AttributePath 转换规则,解析为完整路径 |
org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl | 命名不依赖任何JPA注解 |
org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl | 匹配JPA1.0标准的实现 |
物理命名策略
将显式指定或隐式命名策略转换得到的逻辑名称转换为数据库实际使用的物理名称
- 配置路径:spring.jpa.hibernate.naming.physical-strategy
- 配置值:指定实现 org.hibernate.boot.model.naming.PhysicalNamingStrategy 接口的类全名
- 默认值:org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
可选官方实现:
类名 | 说明 |
---|---|
org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy | 将驼峰规则的命名转换为下划线规则 |
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl | 保持与逻辑名称一致,不做任何转换 |
源码
spring-boot-autoconfigure org/springframework/boot/autoconfigure/orm/jpa/HibernateProperties.java
代码语言:javascript复制@ConfigurationProperties("spring.jpa.hibernate")
public class HibernateProperties {
// 命名策略配置
private final Naming naming = new Naming();
// DDL模式配置
private String ddlAuto;
...
// 读取DDL模式配置,按优先级读取配置或默认值
private String determineDdlAuto(Map<String, String> existing, Supplier<String> defaultDdlAuto) {
// 1. 获取hibernate.hbm2ddl.auto配置值
String ddlAuto = existing.get(AvailableSettings.HBM2DDL_AUTO);
if (ddlAuto != null) {
return ddlAuto;
}
// 2. 获取spring.jpa.hibernate.ddl-auto配置值
if (this.ddlAuto != null) {
return this.ddlAuto;
}
// 3. 获取jakarta.persistence.schema-generation.database.action配置值
if (existing.get(AvailableSettings.JAKARTA_HBM2DDL_DATABASE_ACTION) != null) {
return null;
}
// 4. 默认为null
return defaultDdlAuto.get();
}
// 命名策略配置类
public static class Naming {
// 应用命名策略(没有配置属性则填充默认值)
private void applyNamingStrategies(Map<String, Object> properties) {
applyNamingStrategy(properties, AvailableSettings.IMPLICIT_NAMING_STRATEGY, this.implicitStrategy,
() -> SpringImplicitNamingStrategy.class.getName());
applyNamingStrategy(properties, AvailableSettings.PHYSICAL_NAMING_STRATEGY, this.physicalStrategy,
() -> CamelCaseToUnderscoresNamingStrategy.class.getName());
}
...
}
...
}