当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《内存数据库H2中的SpringBoot在初始化时不从文件加载数据》经验,为你挑选了1个好方法。

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

schema.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 {
}

我还配置了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 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> Maciej Kowal..:

您始终可以尝试按照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

启动时可能会引起一些冲突.所以你应该总是瞄准一个或另一个,但不要同时瞄准.对于简单的情况,仅这些就足以自动构建表并在关闭和启动后重新加载

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有