SpringBoot 2.0搭配Hibernate 5时spring.jpa.hibernate.ddl-auto=create失效问题
spring.jpa.hibernate.ddl-auto=create 不生效的排查方案 我来帮你梳理下这个问题——从SpringBoot 1.5.x升级到2.0.x后,Hibernate的DDL自动生成配置失效是个典型的版本兼容问题,核心原因是SpringBoot 2.x在JPA自动配置逻辑上做了不少调整,咱们一步步排查:
先确认配置属性的正确性与兼容性
虽然spring.jpa.hibernate.ddl-auto这个属性在2.0版本中并没有被移除,但要注意两个点:一是检查配置文件里的拼写是否完全正确(比如有没有少写jpa前缀);二是SpringBoot 2.0默认搭配的Hibernate版本是5.2+,相比1.5.x的5.0/5.1,部分旧的Hibernate配置逻辑有变化,如果你项目里手动指定了Hibernate版本,要确保和SpringBoot 2.0兼容。排查是否覆盖了自动配置逻辑
如果你的项目里自定义了DataSource、EntityManagerFactory或者用@EnableAutoConfiguration(exclude=...)排除了JPA相关的自动配置类,很可能会导致SpringBoot无法自动加载你的DDL配置。检查下项目里的配置类,看看是否在自定义配置时遗漏了传递ddl-auto参数给Hibernate。开启DEBUG日志看配置加载过程
你只提供了1.5版本的启动日志,建议在2.0版本的项目里开启DEBUG级别日志,追踪JPA配置的加载细节。在application.properties里添加:logging.level.org.springframework.orm.jpa=DEBUG logging.level.org.hibernate=DEBUG启动后搜索关键字
ddl-auto或者hbm2ddl.auto,看看Hibernate初始化时实际读取到的DDL策略是不是create——如果日志里显示的是none或者其他值,说明配置没有被正确读取。确认实体类扫描路径是否正确
要是Hibernate找不到你的实体类,自然不会生成表。检查下是否用@EntityScan指定了实体类路径,或者路径是否和项目结构匹配;如果没加@EntityScan,SpringBoot默认会扫描主启动类所在包及其子包下的实体类,确认你的实体类是否在这个范围内。尝试使用Hibernate原生配置属性
如果上面的方法都没解决,可以绕过SpringBoot的JPA封装,直接用Hibernate原生属性配置:spring.jpa.properties.hibernate.hbm2ddl.auto=create有时候SpringBoot的自动配置会对
spring.jpa.hibernate.ddl-auto做一层转换,直接用原生属性能避免这种转换带来的问题。
内容的提问来源于stack exchange,提问作者Mehraj Malik

