Java Spring引导,Hibernate在H2数据库启动时生成drop约束错误

Java Spring引导,Hibernate在H2数据库启动时生成drop约束错误,java,spring,hibernate,jpa,h2,Java,Spring,Hibernate,Jpa,H2,我使用的是SpringBoot,并且有一个H2数据库配置如下(在application.properties中) 在日志中,我看到以下错误: o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [ name: default ...] org.hibernate.Version : HHH000412: Hib

我使用的是SpringBoot,并且有一个H2数据库配置如下(在application.properties中)

在日志中,我看到以下错误:

o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
        name: default
        ...]
org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.5.Final}
org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
o.h.h.i.ast.ASTQueryTranslatorFactory    : HHH000397: Using ASTQueryTranslatorFactory
org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000227: Running hbm2ddl schema export
org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: alter table key_request drop constraint FK_53shrbc21c25inskpp1yoxxss if exists
org.hibernate.tool.hbm2ddl.SchemaExport  : Table "KEY_REQUEST" not found; SQL statement:
    alter table key_request drop constraint FK_53shrbc21c25inskpp1yoxxss if exists [42102-178]
即使hibernate将这些报告为错误,我也可以登录到H2控制台,查看约束,它们看起来很好

SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, INDEX_TYPE_NAME FROM information_schema.indexes WHERE TABLE_NAME='KEY_REQUEST';
TABLE_NAME    INDEX_NAME                            COLUMN_NAME  INDEX_TYPE_NAME  
KEY_REQUEST   PRIMARY_KEY_F                         REQUEST_ID   PRIMARY KEY
KEY_REQUEST   FK_53SHRBC21C25INSKPP1YOXXSS_INDEX_F  USER_ID      INDEX
如果看起来hibernate真的试图在实际创建数据库之前删除这些约束(即hibernate中的某种bug)。 是否有任何方法可以避免这些错误阻塞日志,或者是否表明某个地方出现了真正的故障

更新1 尝试使用此设置强制应用程序仅执行更新:

spring.jpa.hibernate.ddl-auto=update
导致以下错误(所有其他错误消失):

注:来源如下:

特别是配置:

模型:

因为您使用的是内存中的数据库,所以Hibernate在执行以下操作时找不到任何表:

hibernate.hbm2ddl.auto=create-drop
这是因为语句顺序是:

  • 删除约束(fk)
  • 放下桌子
  • 创建表
  • 创建约束(fk)

您可以通过将hibernate.hbm2ddl.auto更改为update来修复此问题:

hibernate.hbm2ddl.auto=update

谢谢,这是我的工作

###Spring数据源(数据源自动配置和数据源属性)
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres
#SQL方言使Hibernate为所选数据库生成更好的SQL
spring.jpa.properties.hibernate.dialogue=org.hibernate.dialogue.PostgreSqlDialogue
spring.jpa.database platform=org.hibernate.dial.postgresql9dial
#Hibernate ddl自动(创建、创建、删除、验证、更新)
spring.jpa.hibernate.ddl auto=create
logging.level.org.hibernate.SQL=DEBUG
hibernate.hbm2ddl.auto=更新
spring.jpa.properties.hibernate.jdbc.lob.non_context_creation=true
#启用响应压缩
server.compression.enabled=true
#应压缩的mime类型的逗号分隔列表
mime types=text/html、text/xml、text/plain、text/css、text/javascript、application/javascript、application/json
#仅当响应大小至少为1KB时压缩响应
server.compression.min响应大小=1024
server.http2.enabled=true
#应缓存响应的最长时间(秒)
spring.resources.cache.cachecontrol.max age=120
#缓存必须与服务器一起重新验证过时的资源。未经重新验证,不得使用任何过期的资源。
spring.resources.cache.cachecontrol.must revalidate=true
#https://www.callicoder.com/configuring-spring-boot-application/

server.port=8080
尝试只创建:

spring.jpa.properties.hibernate.hbm2ddl.auto=create-only
它至少从5.2开始添加到Hibernate中(可能更早),我没有找到任何合适的文档,但它提到了

此外,如果您在日志中看到:

WARN  SessionFactoryOptionsBuilder:394 - Unrecognized hbm2ddl_auto value : create-only.  Supported values include 'create', 'create-drop', 'update', 'none' and 'validate'.  Ignoring

这可能是一个假警报,

非常接近,但会导致以下错误:2014-07-14 org.hibernate.tool.hbm2ddl.SchemaUpdate:HHH000388:不成功:更改表lti_结果添加约束FK_1cnh9amy5br8owkmafsrth3as外键(结果id)引用lti_链接org.hibernate.tool.hbm2ddl.SchemaUpdate:constraint“FK_1CNH9AMY5BR8OWKMAFSRTH3AS”已存在;SQL语句:alter table lti_结果添加约束FK_1CNH9AMY5BR8OWKMAFSRTH3AS外键(结果id)引用lti_链接[90045-178]我将用额外的细节更新这个问题,这就是为什么我使用Flyway增量更新而不是依赖Hibernate模式生成。那么,你是说如果我使用Hibernate,就没有办法避免这些失败吗?一个常见的误解是创建drop先删除表,然后再创建。事实上,就像ter的顺序一样ms在create drop suggest中,它首先创建表,然后在处理会话工厂时删除表。请参阅Hibernate文档:。因此,这并不能解释azeckoski的问题。这可能是Hibernate中的一个错误。这是普遍共识吗?我也有同样的问题(在稍旧的版本4.2.8上)。错误是良性的,Hibernate捕获这些异常并创建架构。但它看起来确实像一个bug。当您第一次创建架构时,没有必要删除约束。“创建”被实现为“替换”“。对不起,您的示例与我们试图解决的问题无关。这一个对我有效,但我很好奇它是否会对模式产生任何影响?我有“更新”作为价值,我有各种恼人的警告。一旦我把它改成“只创建”,它们就消失了。但是从“更新”改为“只创建”可以吗。。。对于内存中的H2,这并不重要,因为数据库将在退出时被销毁。对于任何其他持久性数据库,您必须使用Liqbase/Flyweight/DBMain或任何其他迁移工具
hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.hbm2ddl.auto=create-only
WARN  SessionFactoryOptionsBuilder:394 - Unrecognized hbm2ddl_auto value : create-only.  Supported values include 'create', 'create-drop', 'update', 'none' and 'validate'.  Ignoring