Spring Boot 应用程序中的 H2 Schema 为空

Posted

技术标签:

【中文标题】Spring Boot 应用程序中的 H2 Schema 为空【英文标题】:H2 Schema Empty in Spring Boot Application 【发布时间】:2016-08-22 01:20:27 【问题描述】:

我正在设置一个准系统 Spring Boot 项目described here,但我遇到了基本设置问题。

似乎没有调用 DatabaseLoader,当我打开这个项目的 H2 控制台时,我看不到包含 Employee 表的架构。

这是我的 pom.xml 的相关部分:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <!-- 
        <scope>runtime</scope>
         -->
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.4</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

我的域名:

@Data
@Entity
public class Employee 
    private @Id @GeneratedValue Long id;
    private String firstName;
    private String lastName;
    private String description;

    public Employee() 

    public Employee(String firstName, String lastName, String description) 
        this.firstName = firstName;
        this.lastName = lastName;
        this.description = description;
    


还有数据库加载器: 公共类 DatabaseLoader 实现 CommandLineRunner 私有最终 EmployeeRepository 存储库;

    @Autowired
    public DatabaseLoader(EmployeeRepository repository) 
        this.repository = repository;
    

    @Override
    public void run(String... strings) throws Exception 
        this.repository.save(new Employee("duke", "earl", "dude"));
    


应用程序在 localhost:8080/console 启动后导航到控制台显示 jdbc:h2:~/test 只有一个 INFORMATION_SCHEMA 和用户菜单。我还将它设置为 CRUD 存储库,虽然我可以发布到它,但似乎没有保存任何属性数据,但可以识别员工资源。

POST:"firstName": "Bilbo", "lastName": "Baggxins", "description": "burglar"

返回:


  "_links": 
    "self": 
      "href": "http://localhost:8080/api/employees/4"
    ,
    "employee": 
      "href": "http://localhost:8080/api/employees/4"
    
  

【问题讨论】:

【参考方案1】:

Spring Boot 的默认 h2 url 为:jdbc:h2:mem:testdb

要使用jdbc:h2:~/test,您必须将其添加到您的application.properties

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:~/test

发生的事情是,您正在 spring-boot 的内存数据库 (testdb) 中写入 Employee。然后,你打开 h2-console 到jdbc:h2:~/test,它会即时创建它,让你浏览空虚。

使用spring.h2.console.enabled=true,您可以打开浏览器到http://localhost:8080/h2-console 并查看数据库内容。使用以下设置:

保存的设置:通用 H2(嵌入式) 驱动类:org.h2.Driver 网址:jdbc:h2:mem:testdb 用户名:sa 密码:

【讨论】:

这确实使控制台正常工作-谢谢!提交我的帖子会在表中创建一条记录,但名称和描述字段均为空。这可能是一个龙目岛问题,对我来说也是新问题,我现在正在调查这个问题 我现在就试试,但我几乎是从教程“React.js 和 Spring Data REST:第 1 部分”复制粘贴的,所以我不确定为什么它不会就像宣传的那样工作 我手动添加了 getter/setter 并且它起作用了。奇怪的!我会调查原因,但感谢您的帮助 顺便说一句,有没有办法打开控制台指向 jdbc:h2:mem:testdb? 我没有将 Lombok 添加到我的项目中,因为我不知道这是必要的。伙计,我在这里出类拔萃!但这确实奏效了。非常感谢您的帮助【参考方案2】:

这是无耻地从乔什·朗那里借来的。这是一个有效的CommandLineRunner 实现。 Github full code

@Component
class SampleRecordsCLR implements CommandLineRunner 

  private final ReservationRepository reservationRepository;

  @Autowired
  public SampleRecordsCLR(ReservationRepository reservationRepository) 
    this.reservationRepository = reservationRepository;
  

  @Override
  public void run(String... args) throws Exception 
      Stream.of("Josh", "Jungryeol", "Nosung", "Hyobeom",
              "Soeun", "Seunghue", "Peter", "Jooyong")
              .forEach(name -> reservationRepository.save(new Reservation(name)));

      reservationRepository.findAll().forEach(System.out::println);
  

【讨论】:

以上是关于Spring Boot 应用程序中的 H2 Schema 为空的主要内容,如果未能解决你的问题,请参考以下文章

无法加载驱动程序类:在 Spring Boot 应用程序中的 org.h2.Driver

spring-boot 文件系统中的持久 h2 数据库

使用 Liquibase 为 Spring Boot 应用程序中的单元测试初始化​​内存 H2

使用 MyBatis + H2 配置 Spring Boot 身份验证/登录

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

为spring boot配置h2