Hibernate执行DDL报Schema不存在与@ManyToMany配置问题求助
排查修复步骤
第一步 优先确认Schema初始化配置
H2默认不会自动创建自定义schema,该报错90%概率是启动时news_schema还没创建,Hibernate就开始执行建表、加外键的DDL导致的。
检查application.properties/application.yml的数据库连接配置,加上自动创建schema的参数:
在spring.datasource.url的末尾追加;INIT=CREATE SCHEMA IF NOT EXISTS news_schema,示例:
spring.datasource.url=jdbc:h2:mem:newsdb;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS news_schema spring.jpa.properties.hibernate.default_schema=news_schema
加上配置后重启项目,80%的情况可以直接解决问题。
第二步 检查实体类关联配置
如果加了配置还是报错,检查三个实体类的配置:
- 所有实体的
@Table注解要么都加schema = "news_schema"属性,要么都不加(已经配置了全局default_schema的情况),不要部分标注部分不标注 - 所有
@ManyToMany对应的@JoinTable注解必须指定schema(如果没配置全局default_schema),同时确认joinColumns、inverseJoinColumns的字段名和关联实体的主键字段名完全一致,示例配置:
// Article实体的多对多配置示例 @ManyToMany @JoinTable( name = "article_author", schema = "news_schema", joinColumns = @JoinColumn(name = "article_id"), inverseJoinColumns = @JoinColumn(name = "author_id") ) private List<Author> authors;
第三步 异常场景兜底处理
如果还是报错,添加以下配置打印Hibernate生成的DDL语句,定位具体是哪条语句出问题:
spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
如果是中间表生成顺序导致的外键报错,临时开发场景可以添加配置禁用外键约束校验:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect spring.jpa.properties.hibernate.hbm2ddl.auto=update spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
内容的提问来源于stack exchange,提问作者Smetana Po Aktsii
相关产品推荐
相关产品推荐

