内存数据库 H2 中的 Spring Boot 在初始化时不从文件加载数据

2022-09-04 21:19:15

我在应用程序初始化时将数据加载到内存中数据库时遇到问题。我已经创建了包含表结构和初始数据的模式.sql和数据.sql文件。

架构.sql :

CREATE TABLE users (
  id          INT PRIMARY KEY,
  username    VARCHAR(64) NOT NULL,
  password    VARCHAR(64) 
);

数据.sql

INSERT INTO users (id, username, password) VALUES
  (1, 'usr1', 'bigSecret'),
  (2, 'usr2', 'topSecret');

我用于处理数据层:JpaRepository

public interface UserRepository extends JpaRepository<User, Long> {
}

我还配置了 application.properties

spring.datasource.initialize=true
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

但是当我打电话时

List<User> users = userRepository.findAll();

用户实体

@Entity
@Table(name = "users")
public class User {

  @Id
  @GeneratedValue
  private Long id;
  private String username;
  private String password;

  public User() {  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }
}

我得到一个空列表,但我应该从内存中的H2数据库中获取两个预填充的用户。内存数据库有什么问题?谢谢。


答案 1

您始终可以尝试根据 h2 的规范运行这些脚本,其中应在连接 URL 中添加一个 INIT 脚本(作为选项之一):

jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '~/schema.sql'\;RUNSCRIPT FROM '~/data.sql'"

此功能通过 INIT 属性启用。请注意,可以将多个命令传递给 INIT,但必须对分号分隔符进行转义,如下面的示例所示。

更新

请注意,在以下位置具有这些选项:application.properties

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=true
spring.datasource.initialize=true

在启动过程中可能会导致一些冲突。因此,您应该始终以其中之一为目标,但绝不能同时针对两者。对于简单的情况,仅凭这些就足以在关闭和启动后自动构建表并重新加载


答案 2

当我将以下行添加到 application.properties 中时,我解决了类似的问题:

spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.session.jdbc.initialize-schema=always
spring.sql.init.data-locations=classpath:schema.sql,classpath:data.sql

推荐