繁体   English   中英

无法在 h2 内存数据库中插入数据

[英]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。

H2 数据库


更新

创建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

在此处输入图片说明 H2


更新 2

是的,Spring Boot 可以为你自动创建表,确保你有@Table(name = "TableName")spring.jpa.hibernate.ddl-auto=createspring.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 ...作为第一步; 这每次初始化数据库
  • 并包含用于创建表和插入数据的 sql

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM