Spring Boot Embedded Derby 在最新版本中不起作用。

Posted

技术标签:

【中文标题】Spring Boot Embedded Derby 在最新版本中不起作用。【英文标题】:Spring boot Embedded Derby not working in the latest version. 【发布时间】:2018-08-27 01:43:25 【问题描述】:

我之前在 Spring Boot 项目中使用过 Embedded derby。但是现在当我通过带有 derby 依赖项的 Spring Initializr 创建项目时。我收到以下错误: 架构“SA”不存在 其次是org.hibernate.tool.schema.spi.CommandAcceptanceException: Error execution DDL via JDBC Statement

当我尝试运行我创建的早期项目时,Derby 运行良好。 PFB 早期项目的控制台:

2018-03-18 15:34:44.346 INFO 16560 --- [restartedMain] org.hibernate.cfg.Environment:HHH000021:字节码 提供者名称:javassist 2018-03-18 15:34:44.391 INFO 16560 --- [ restartedMain] o.hibernate.annotations.common.Version:HCANN000001: Hibernate Commons Annotations 5.0.1.Final 2018-03-18 15:34:44.490 **INFO 16560 --- [restartedMain] org.hibernate.dialect.Dialect :HHH000400:使用方言:org.hibernate.dialect.DerbyDialect 2018-03-18 15:34:44.497 WARN 16560 --- [restartedMain] org.hibernate.dialect.DerbyDialect:HHH000430:DerbyDialect 方言已被弃用;使用一种特定于版本的方言 ** 改为 2018-03-18 15:34:45.094 INFO 16560 --- [restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport:HHH000227:运行 hbm2ddl 架构导出 2018-03-18 15:34:45.099 错误 16560 --- [ restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport:HHH000389: 不成功:drop table book 2018-03-18 15:34:45.099 ERROR 16560 --- [restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport:架构 'SA' 不存在 2018-03-18 15:34:45.129 WARN 16560 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 警告 代码:10000,SQLState:01J01 2018-03-18 15:34:45.129 WARN 16560 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : 数据库 'memory:testdb' 未创建,连接到现有数据库 反而。 2018-03-18 15:34:45.129 信息 16560 --- [restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport:HHH000230:模式导出 完成 2018-03-18 15:34:45.152 INFO 16560 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean :初始化的 JPA 持久性单元“默认”的 EntityManagerFactory

我当前的带有嵌入式 derby 的 Spring Boot 的控制台日志:

2018-03-18 15:42:23.234 信息 11312 --- [主要] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始... 2018-03-18 15:42:23.237 警告 11312 --- [主要] **com.zaxxer.hikari.util.DriverDataSource : 注册驱动程序 driverClassName=org.apache.derby.jdbc.EmbeddedDriver 未找到, 尝试直接实例化。 2018-03-18 15:42:23.844 信息 11312 --- [ ** 主要] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - 驱动程序 不支持获取/设置连接的网络超时。 (功能不 已实施:无详细信息。)2018-03-18 15:42:23.847 INFO 11312 --- [ 主] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始 完全的。 2018-03-18 15:42:23.937 信息 11312 --- [主要] j.LocalContainerEntityManagerFactoryBean : 构建 JPA 容器 持久性单元“默认”的 EntityManagerFactory 2018-03-18 15:42:23.969 信息 11312 --- [主要] o.hibernate.jpa.internal.util.LogHelper:HHH000204:处理中 PersistenceUnitInfo [名称:默认...] 2018-03-18 15:42:24.136 信息 11312 --- [主] org.hibernate.Version : HHH000412: Hibernate Core 5.2.14.Final 2018-03-18 15:42:24.138 信息 11312 --- [主] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found 2018-03-18 15:42:24.199 信息 11312 --- [主要] o.hibernate.annotations.common.Version:HCANN000001:休眠 Commons Annotations 5.0.1.Final 2018-03-18 15:42:24.380 INFO 11312 --- [主要] org.hibernate.dialect.Dialect:HHH000400:使用方言:org.hibernate.dialect.DerbyTenSevenDialect 2018-03-18 15:42:25.572 警告 11312 --- [主要] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget 遇到异常接受命令:通过 JDBC 执行 DDL 时出错 声明

org.hibernate.tool.schema.spi.CommandAcceptanceException: 错误 通过 JDBC 语句执行 DDL org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final] 在 org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlString(SchemaDropperImpl.java:375) [hibernate-core-5.2.14.Final.jar:5.2.14.Final]

我可以发现两者之间的区别在于,在当前日志(abv log)中,它表示 com.zaxxer.hikari.util.DriverDataSource : 注册驱动程序 driverClassName=org.apache.derby.jdbc.EmbeddedDriver 未找到, 尝试直接实例化。

如果我们需要配置以下依赖项之外的其他内容以启用此 derby,请告诉我。注意-除了上一个项目中的 maven 依赖项之外,我还没有做任何事情。

Maven 依赖:

<dependency>
 <groupId>org.apache.derby</groupId>            
 <artifactId>derby</artifactId>
 <scope>runtime</scope>         
 </dependency>

【问题讨论】:

看起来像 persistence.xml 中的架构“SA”不存在数据库 【参考方案1】:

我在 application.properties 中添加了下面的属性,它起作用了!

spring.jpa.hibernate.ddl-auto=update

【讨论】:

【参考方案2】:

在 appplication.properties 中添加了这个并且工作了

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=default
spring.jpa.show-sql=true

【讨论】:

【参考方案3】:

将 spring.jpa.hibernate.ddl-auto=update 添加到您的 application.properties 默认是create-drop

【讨论】:

【参考方案4】:

derby默认使用的驱动是org.apache.derby.jdbc.AutoloadedDriver,但是springboot等框架选择org.apache.derby.jdbc.EmbeddedDriver。 导致驱动第一次使用数据源时找不到驱动。

关于Schema 'SA' does not exist。 我认为您使用其他工具连接德比,例如ij。而且他们使用的jdbc url是一样的。它看起来像连接了同一个数据库,但实际上并非如此。 这是问题的关键。

【讨论】:

【参考方案5】:

请根据您的要求配置您的 JPA 配置。我已经配置如下。您需要在 application.properties 文件中添加以下配置。

# PROFILES
spring.profiles.active=dev
# JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=default
spring.jpa.show-sql=true
# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.continue-on-error=false
spring.datasource.generate-unique-name=false

【讨论】:

以上是关于Spring Boot Embedded Derby 在最新版本中不起作用。的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot Embedded MongoDb 数据预填充

Spring-Boot Embedded Tomcat - 生成 localhost.log 和 cataline.out 文件

Spring Boot 使用Jar打包发布, 并使用 Embedded Jetty/Tomcat 容器

Spring Boot Embedded Derby 在最新版本中不起作用。

我如何在@Embeddable 类中使用@Embedded 将json 发布到spring boot 控制器

如何使用 Embedded Tomcat 8 和 Spring boot 将子域转换为路径