为啥 import.sql 在 Spring Boot 中会失败?

Posted

技术标签:

【中文标题】为啥 import.sql 在 Spring Boot 中会失败?【英文标题】:Why would import.sql fail in Spring Boot?为什么 import.sql 在 Spring Boot 中会失败? 【发布时间】:2015-09-21 06:10:41 【问题描述】:

我在 Spring Boot 上关注了 this tutorial。

这家伙走得很快,但我们的代码似乎一切都一样。当我开始查看 H2 控制台时,我注意到我错过了我的 Speaker 表。

我在这里看到了很多问题,到处都是博客,似乎您所要做的就是将文件放在main/resources 中,它就可以工作。好吧,它没有!

一些答案​​谈论persistence.xml 和/或H2 的配置文件。好吧,我没有这些,那个教程和他的作品也没有。

我发现一些看似最简单的事情对 Spring 来说非常令人沮丧,我厌倦了环顾四周并找到不起作用的相同答案。

有人能解释一下为什么会失败吗?

我无法想象除了我的 pom.xml 之外我还需要什么,因为本教程只是添加了 import.sql 并且就像其他人声称的那样 - 它可以正常工作。 如果需要,我会添加更多。

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.test</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <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-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

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

import.sql

INSERT INTO SPEAKER(ID, FIRST_NAME, LAST_NAME, TWITTER, BIO) VALUES (0, 'Foo', 'Baz', 'foobaz', 'Foo Baz hates Twitter');
INSERT INTO SPEAKER(ID, FIRST_NAME, LAST_NAME, TWITTER, BIO) VALUES (1, 'Bar', 'Baz', 'barbaz', 'Bar Baz hates Twitter too');
INSERT INTO SPEAKER(ID, FIRST_NAME, LAST_NAME, TWITTER, BIO) VALUES (2, 'Santa', 'Clause', 'saintnick', 'Santa is a Twitter champ');

【问题讨论】:

import.sql 不(或不应该)用于创建表,这就是 schema.sql 的用途。那么import.sql 中的内容是什么。通常模式创建是使用 schema.sql 完成的,或者留给 JPA 提供者。 @M.Deinum,这很有趣。这正是这家伙所做的。我将重命名它并在这里查看它的内容。就语句而言,它也是一样的...... H2 旁边(正如我在教程中看到的)最初用作您无法连接的内存数据库。因此,如果您尝试使用控制台连接到内存数据库,它将无法正常工作,因为您将看到一个新数据库,而不是本教程使用的数据库。至少对于外部控制台,如果您使用在教程中注册的 servlet,它应该可以工作(因为应该重用现有数据源)。 @M.Deinum,我想就是这样。我对此感到困惑。也许是因为他们没有说清楚。那么,这是否意味着它正在导入但我无法从控制台看到它? 您使用的是哪个控制台?您是在运行独立控制台还是在教程中作为 servlet 包含的控制台? 【参考方案1】:

经过更仔细的调查,我在一个次要但重要的细节中找到了答案。显然,当控制台启动时,它为表单条目添加了默认值,并且与教程中的不同。

对于JDBC URL,默认值为jdbc:h2:~/test

我不得不把它改成jdbc:h2:mem:testdb

我现在可以看到Speaker 表和数据。

一旦我进行了更改,它就会保持默认状态。我想作者已经这样做了,我错过了差异。

感谢您的帮助@M。迪南!

【讨论】:

您可以通过spring.datasource.name更改数据源的名称;它的默认值确实是testdb

以上是关于为啥 import.sql 在 Spring Boot 中会失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥dependencyManagement中有spring-boot-dependencies?

Spring Boot / Spring Data import.sql 不运行 Spring-Boot-1.0.0.RC1

Spring Test:无法从 import.sql 文件将十六进制值插入 hsqldb

Spring Mvc Hibernate Encoding/多行导入sql

在hibernate中导入import.sql不成功

easy-rules-centraldogma-spring-boot-starter 引入外部rule