当前位置: 首页 > article >正文

spring.jpa.hibernate 配置和源码解析

版本

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

@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());
		}
		...
	}
	...
}

http://www.kler.cn/a/229555.html

相关文章:

  • Java10-BigDecimal使用(位数、舍入、计算、比较、绝对值)
  • git rebase # |REBASE 1/1 #rebase in progress; onto
  • 可解释性AI(XAI)的主要实现方法和研究方向
  • 生物素-PEG4-酪胺,Biotin-PEG4-TSA,应用于酶联免疫吸附实验
  • containerd中文翻译系列(七)远程快照器
  • Java-并发高频面试题-2
  • 使用pygame建立一个简单的使用键盘方向键移动的方块小游戏
  • STM32内部Flash
  • 五、Redis之发布订阅及事务管理
  • Postman发送带登录信息的请求
  • 第43章 弗莱纳公式准备1 空间曲面坐标 ,梯度解释
  • 升级Oracle 单实例数据库19.3到19.22
  • 车位检测,YOLOV8,OPENCV调用
  • 单点登录怎么做?SSO实现原理和优势总结
  • 力扣面试150 数字范围按位与 公共前缀 位运算
  • 软件行业项目管理的优化策略与实施指南
  • Python调用matlab程序
  • 支持534种语言,开源大语言模型MaLA-500
  • 「云原生可观测团队」获选「InfoQ 年度技术内容贡献奖」
  • 实体类和Map类型相互转换