[英]cannot insert data in h2 in-memory database
我在 inMemory 数据库中插入数据,在插入数据时我遇到了问题,
使用boot向inMemory中插入数据的示例程序,JPA,H2db
创建 Pojo 并使用 JPA 注释进行注释
创建了 data.sql 文件用于查询。
运行应用程序。 请在屏幕截图中查找问题详细信息。
我尝试了多种方法,但仍然是相同的异常
在app.prop中配置: String url = jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE
在 data.sql 文件中添加了带有给定表的@Table
添加@Column
名称用于转换,如 data.sql 中所述。
在哪里配置; DB_CLOSE_ON_EXIT=FALSE
在 springboot 中?
POJO
@Entity
@Table(name = "exchange_value")
public class CurrencyExchange {
@Id
private Long id;
@Column(name = "currency_from")
private String from;
@Column(name = "currency_to")
private String to;
@Column(name = "conversion_multiple")
private BigDecimal conversion;
private int port;
Controller
@Autowired
private Environment env;
@GetMapping("/currency-exchange/from/{from}/to/{to}")
public CurrencyExchange retriveCurrencyExchange(@PathVariable String from,@PathVariable String to)
{
CurrencyExchange currencyExchange = new CurrencyExchange(1000L, from, to, BigDecimal.valueOf(65));
currencyExchange.setPort(Integer.parseInt(env.getProperty("local.server.port")));
return currencyExchange;
}
}
应用程序属性
spring.application.name=currency-exchange-service
server.port=8000
spring.jpa.show-sql=true
spring.h2.console.enabled=true
data.sql file
insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
values(1001,'USD','INR',65,0);
insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port)
values(1002,'EUR','INR',75,0);
Output: The data should be inserted into in-memory database while hitting the service.
错误原因:在名为“inMemoryDatabaseShutdownExecutor”的 bean 上调用 destroy 方法失败:org.h2.jdbc.JdbcSQLNonTransientConnectionException:数据库已关闭(要禁用 VM 关闭时自动关闭,请将“;DB_CLOSE_ON_EXIT=FALSE”添加到数据库 URL) [90121-199] org.springframework.beans.factory.BeanCreationException:创建名为“entityManagerFactory”的 bean 在 class 路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class] 中定义时出错:bean 初始化失败; 嵌套异常是 org.springframework.jdbc.datasource.init.ScriptStatementFailedException:无法执行 SQL 脚本语句 #1 of URL [file:/Users/naresh/Documents/workspace-sts-3.9.8.RELEASE/currency-exchange-service /target/classes/data.sql]: insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port) values(1001,'USD','INR',65,0); 嵌套异常是 org.h2.jdbc.JdbcSQLSyntaxErrorException:未找到表“EXCHANGE_VALUE”; SQL 语句:插入 exchange_value(id,currency_from,currency_to,conversion_multiple,port) values(1001,'USD','INR',65,0) [42102-199] org.h2.jdbc.JdbcSQLSyntaxErrorException:表“EXCHANGE_VALUE”未找到; SQL 语句:插入 exchange_value(id,currency_from,currency_to,conversion_multiple,port) values(1001,'USD','INR',65,0) [42102-199]
改变
String url = jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE
到
spring.datasource.url: 'jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1'
在application-properties
另外,在插入记录之前,请确保表exchange_value
存在(您已经编写了用于创建表的 SQL) 。
要保持数据库打开,请将 ;DB_CLOSE_DELAY=-1 添加到数据库 URL。 要在虚拟机处于活动状态时保留内存数据库的内容,请使用 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。
更新
创建2个sql文件。 一个用于创建架构,另一个用于插入记录
应用程序属性
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# Enabling H2 Console
spring.h2.console.enabled=true
# Custom H2 Console URL
spring.h2.console.path=/h2
更新 2
是的,Spring Boot 可以为你自动创建表,确保你有@Table(name = "TableName")
和spring.jpa.hibernate.ddl-auto=create
或spring.jpa.hibernate.ddl-auto=update
实体
@Entity
@Table(name="exchange_value")
public class ExchangeValueEntity {
//some fields
}
应用程序属性
spring.jpa.hibernate.ddl-auto=create
如果有人遇到此问题,请在 .properties 文件中设置此属性
默认情况下,data.sql 脚本在 Hibernate 初始化之前执行。 这使基于脚本的初始化与其他数据库迁移工具(如 Flyway 和 Liquibase)保持一致。 当我们每次重新创建由 Hibernate 生成的模式时,我们需要设置一个额外的属性:
spring.jpa.defer-datasource-initialization=true
确保您已在资源文件夹中提供了 data.sql。
这有效
spring.application.name=currency-exchange-service
server.port= 8000
spring.datasource.url=jdbc:h2:mem:testdb
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update
确保:
ddl-auto
设置为update
; 不知何故,只有这允许数据插入drop all objects; create schema...; set schema ...
drop all objects; create schema...; set schema ...
drop all objects; create schema...; set schema ...
作为第一步; 这每次初始化数据库
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.