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

标签 java spring spring-boot spring-data-jpa h2

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

架构.sql :

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

data.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 数据库中得到两个预填充的用户。内存数据库有什么问题? 谢谢。

最佳答案

您始终可以尝试按照 h2 规范运行这些脚本,您应该在连接 url 中添加一个 INIT 脚本(作为选项之一):

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

This functionality is enabled via the INIT property. Note that multiple commands may be passed to INIT, but the semicolon delimiter must be escaped, as in the example below.

更新

请注意,在您的 application.properties 中有这些选项:

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

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

关于java - 内存数据库H2中的Spring Boot不会在初始化时从文件加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41841072/

相关文章:

java - 如何使用 bean 构造函数从 Spring 中的 YAML 列表创建 bean 列表?

ssl - 别名为 mykey 的 SAML-Key 没有私钥

java - 尝试 Autowiring javax.validation.Validator 时奇怪的 spring-boot 行为

java - 在 JFileChooser 中强制执行文件过滤器

java - 如何使用 twitter4j 获取用户时间线的完整推文?

java - 使用 Spring 将 boolean bean 创建转换为 boolean 值

java - 如何将 API 访问信息输出到记录器文件中?

java - HQL QuerySyntaxException : unexpected token 错误

java - 以 Reader 方式打开 InputStream

java - Android SQLiteDatabase - 从数据库中删除值后 ListView 和数据库 ID 不匹配