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

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. 默认为nullreturn 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.lryc.cn/news/295480.html

相关文章:

  • 2019年江苏省职教高考计算机技能考试——一道程序改错题的分析
  • 邦芒支招:职场白领必备的10条护身符
  • python实现飞书群机器人消息通知(消息卡片)
  • 网站服务器中毒或是被入侵该怎么办?
  • Skywalking 学习之ByteBuddy 方法执行时间监控
  • idea vim配置
  • kafka排除zookeeper使用kraft的最新部署方案
  • SQL Server数据库日志查看若已满需要清理的三种解决方案
  • 人工智能 | 深度学习的进展
  • 玩转Java8新特性
  • EasyRecovery2024永久免费版电脑数据恢复软件下载
  • QQ音乐新版客户端的音乐无法解密?来看看解决方法!音乐解锁工具Web+批处理版本合集,附常见问题及解决方法!
  • 2023年12月CCF-GESP编程能力等级认证C++编程一级真题解析
  • 如何决定K8S Pod的剔除优先级
  • 【JavaScript】数据类型
  • JAVA:单例模式提高性能和安全性的优化技巧
  • 如何在 Ubuntu 上安装 ONLYOFFICE 文档 8.0
  • 什么是大模型
  • C#在既有数组中插入另一个数组:Array.Copy方法 vs 自定义插入方法
  • 上位机图像处理和嵌入式模块部署(linux开发板的选择)
  • 2024情人节送女朋友什么礼物?精准送礼看这个就对啦!男生必看!
  • 查询每张表占用磁盘空间大小(达梦数据库)
  • Vue3——创建一个应用
  • 深度学习系列56:使用whisper进行语音转文字
  • 【Web - 框架 - Vue】随笔 - 通过`CDN`的方式使用`VUE 2.0`和`Element UI`
  • 设计模式(行为型模式)备忘录模式
  • opencv案例实战:条码区域分割
  • 《MySQL》超详细笔记
  • 商用密码
  • css1文本属性