繁体   English   中英

如何使用内存数据库让 H2 和 SpringBoot 一起玩得很好?

[英]How do I get H2 and SpringBoot to play nice together using the in memory database?

我正在学习有关使用 JUnit 和 Mockito 进行单元测试的教程视频,并且遇到了一些问题,其中某些东西运行不佳,我正试图找出问题所在。 本教程正在使用 H2 创建一个内存数据库,这是我遇到问题的地方(数据库没有数据)。 我创建了一个新项目,其唯一目的是创建相同的数据库,该数据库可以正常工作,然后在没有数据的情况下失败。 经过几天的研究,我希望有人会看到一些明显我遗漏的东西。 我使用 IntelliJ Idea 21.1.2 作为我的 IDE,Linux Mint OS。 H2 对我来说是新的。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>TestH2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>TestH2</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <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-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

应用程序属性

spring.datasource.url=jdbc:h2:mem:item;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1
spring.h2.console.enabled=true

模式.sql

DROP TABLE IF EXISTS ITEM;

CREATE TABLE ITEM (
    id INT,
    name VARCHAR(255),
    price INT,
    quantity INT
);

数据.sql

INSERT INTO ITEM(id, name, price, quantity)
VALUES
       (10001,'Item1',10,20),
       (10002,'Item2',5,10),
       (10003,'Item3',15,2);

有了上面的内容和我的应用程序文件,项目就建立起来了,当我打开 h2-console 时,我得到了预期的结果。 H2 控制台按预期工作

然而。 . .

如果我尝试添加这样的 Item.java 文件(请注意,如果我注释掉 @Entity 行,它的工作方式如上所示)

package com.example.testh2.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class Item {

    @Id
    private int id;
    private String name;
    private int price;
    private int quantity;

    @Transient
    private int value;

    public Item() {

    }

    public Item(int id, String name, int price, int quantity) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.quantity = quantity;

    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }

    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getValue() { return value; }
    public void setValue(int value) { this.value = value; }


    public String toString() {
        return String.format("Item[%d, %s, %d, %d]", id, name, price, quantity);
    }


}

然后就没有数据了

H2 失败

我猜我错过了一些简单的东西,我只是还没有用谷歌搜索正确的问题。 我已经尝试了默认值以及当前的 datasource.url,我已经尝试将 H2 嵌入到一个文件中(我看到 items.mv.db 文件出现在它应该出现的位置,但控制台没有找到它,IntelliJ 数据库也没有找到它工具)。 任何帮助将不胜感激。

application.properties文件中,添加以下行以关闭冲突的自动模式创建:

spring.jpa.hibernate.ddl-auto=none

您可以在此处阅读更多相关信息: https : //docs.spring.io/spring-boot/docs/1.1.0.M1/reference/html/howto-database-initialization.html

要记住的要点:

  1. H2 是一个内存数据库。 也就是说,如果您重新启动应用程序,现有数据将丢失。
  2. 您的依赖项中有 spring 开发工具,当您在应用程序中执行更改/添加/修改类/任何内容时,它会重新启动应用程序。

根据您的评论:-

然而。 . .

如果我尝试添加这样的 Item.java 文件(请注意,如果我注释掉 @Entity 行,它的工作方式如上所示)

似乎您首先通过 H2 控制台添加数据,然后添加/修改类,如果在插入数据后添加/修改类:spring dev 工具将重新启动您的应用程序,您的 h2 数据将丢失。

建议添加实体类,然后将数据添加到 h2 db,并确保添加数据后不要更改项目中的任何内容。

暂无
暂无

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

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