JPA:第一次自动建表时,报错Cant DROP [xxx];check that column/key exists

报错信息主要内容:

        Cant DROP [xxx];check that column/key exists


报错信息查阅资料:

        在查阅各类博客后,发现一篇比较关键的信息:【JPA在ddl-auto=update时,首次执行报错Cant DROP; check that column/key exists】

        在其中说明了问题是因为一个配置项导致的,但是该文博主并没有给出解决方法的实际内容,于是回归源码查阅,根据类名及关键信息,查到里面有一个配置为:

package org.hibernate.tool.schema.internal;

public abstract class AbstractSchemaMigrator implements SchemaMigrator {
    …………

    private UniqueConstraintSchemaUpdateStrategy uniqueConstraintStrategy;
}

        查阅该枚举后,发现:

JPA:第一次自动建表时,报错Cant DROP [xxx];check that column/key exists_第1张图片

        于是锁定问题原因是因为默认配置是:先删除+后创建。

        那么问题的解决就应该考虑使用第二个:RECREATE_QUIETLY,直接尝试创建,并忽略异常。


问题解决方法:

        在application.yml中配置上述所说的配置,但是由于这个配置并没有提示,于是经过查询后,发现在:

package org.hibernate.cfg;


public interface AvailableSettings extends org.hibernate.jpa.AvailableSettings {
    ……
    /*
        在大多数方言中,唯一列和唯一键都使用唯一约束。 SchemaUpdate 需要创建这些约束,但是 DB 对查找现有约束的支持却极其不一致。此外,非明确命名的唯一约束使用随机生成的字符。因此,从这些策略中进行选择。 org.hibernate.tool.hbm2ddl.UniqueConstraintSchemaUpdateStrategy.DROP_RECREATE_QUIETLY (默认):尝试删除,然后(重新)创建每个唯一约束。忽略任何抛出的异常。 org.hibernate.tool.hbm2ddl.UniqueConstraintSchemaUpdateStrategy.RECREATE_QUIETLY :尝试(重新)创建唯一约束,如果约束已经存在则忽略抛出的异常org.hibernate.tool.hbm2ddl.UniqueConstraintSchemaUpdateStrategy.SKIP :不要尝试创建唯一约束架构更新
    */
    String UNIQUE_CONSTRAINT_SCHEMA_UPDATE_STRATEGY = "hibernate.schema_update.unique_constraint_strategy";

    ……
}

        于是在application.yml中配置:

spring:
  ## jpa配置
  jpa:
    hibernate:
      ddl-auto: ${JPA_HIBERNATE_DDL_AUTO:update}
    open-in-view: ${JPA_OPEN_IN_VIEW:true}
    show-sql: ${JPA_SHOW_SQL:false}
    properties:
      hibernate:
        schema_update:
          ## 该配置是本篇博文的重点,设置后,报错不再出现
          unique_constraint_strategy: RECREATE_QUIETLY

你可能感兴趣的:(JPA,SpringBoot,java,jpa,ddl-auto)