Java H2未在我的Spring Boot应用程序中创建/更新表。我的实体有问题吗?

Java H2未在我的Spring Boot应用程序中创建/更新表。我的实体有问题吗?,java,hibernate,jpa,spring-boot,h2,Java,Hibernate,Jpa,Spring Boot,H2,我想通过使用Hibernate创建CRUD存储库,在H2数据库中保存一些数据 我无法让数据库存储我的条目。目前,我正试图通过创建一个示例条目在更新数据库时实现这一点。条目在日志中看起来不错,但未创建/更新/生成表 在这种情况下,为什么Hibernate不能创建表?如果问题在于我的数据结构 这是我的实体Game.java类,我尝试过不使用@Column注释,没有区别。Id不是自动生成的,我需要能够每次输入我自己的Id: @Entity @Table(name = "GAME") public cl

我想通过使用Hibernate创建CRUD存储库,在H2数据库中保存一些数据

我无法让数据库存储我的条目。目前,我正试图通过创建一个示例条目在更新数据库时实现这一点。条目在日志中看起来不错,但未创建/更新/生成表

在这种情况下,为什么Hibernate不能创建表?如果问题在于我的数据结构

这是我的实体Game.java类,我尝试过不使用@Column注释,没有区别。Id不是自动生成的,我需要能够每次输入我自己的Id:

@Entity
@Table(name = "GAME")
public class Game {

    @Id
    @Column (name = "ID")
    private long id;

    @Column (name = "NAME")
    private String name;

    @Column(name = "STORYLINE", length = 4000)
    private String storyline;

    @Column(name = "AGGREGATED_RATING")
    @JsonProperty("aggregated_rating")
    private double aggregatedRating;

    @Column(name = "FIRST_RELEASE_DATE")
    @JsonProperty("first_release_date")
    private long firstReleaseDate;

    @Embedded
    private Cover cover;

    public Game(){

    }

    public Game(long id, String name, String storyline, double aggregatedRating, long firstReleaseDate, Cover cover) {
        this.id = id;
        this.name = name;
        this.storyline = storyline;
        this.aggregatedRating = aggregatedRating;
        this.firstReleaseDate = firstReleaseDate;
        this.cover = cover;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getStoryline() {
        return storyline;
    }

    public double getAggregatedRating() {
        return aggregatedRating;
    }

    public long getFirstReleaseDate() {
        return firstReleaseDate;
    }

    public Cover getCover() {
        return cover;
    }


}
下面是Cover.java类:

我在application.properties文件中配置了H2数据库:

存储库的配置如下:

import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface GameRepository extends CrudRepository<Game, Long> {
    List<Game> findAllByName(String name);
}
我得到以下日志:

2017-07-25 13:09:58.873 DEBUG 9442 --- [nio-8080-exec-1] org.hibernate.SQL                        : select game0_.id as id1_0_0_, game0_.aggregated_rating as aggregat2_0_0_, game0_.cloudinary_id as cloudina3_0_0_, game0_.height as height4_0_0_, game0_.url as url5_0_0_, game0_.width as width6_0_0_, game0_.first_release_date as first_re7_0_0_, game0_.name as name8_0_0_, game0_.storyline as storylin9_0_0_ from game game0_ where game0_.id=?
Hibernate: select game0_.id as id1_0_0_, game0_.aggregated_rating as aggregat2_0_0_, game0_.cloudinary_id as cloudina3_0_0_, game0_.height as height4_0_0_, game0_.url as url5_0_0_, game0_.width as width6_0_0_, game0_.first_release_date as first_re7_0_0_, game0_.name as name8_0_0_, game0_.storyline as storylin9_0_0_ from game game0_ where game0_.id=?
2017-07-25 13:09:58.875 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [127]
2017-07-25 13:09:58.894 DEBUG 9442 --- [nio-8080-exec-1] org.hibernate.SQL                        : insert into game (aggregated_rating, cloudinary_id, height, url, width, first_release_date, name, storyline, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into game (aggregated_rating, cloudinary_id, height, url, width, first_release_date, name, storyline, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
2017-07-25 13:09:58.895 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [DOUBLE] - [90.25]
2017-07-25 13:09:58.896 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [doczeiofd1ckpapdhqs7]
2017-07-25 13:09:58.896 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [INTEGER] - [1426]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [VARCHAR] - [//images.igdb.com/igdb/image/upload/t_thumb/doczeiofd1ckpapdhqs7.jpg]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [5] as [INTEGER] - [1000]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [6] as [BIGINT] - [1258416000000]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [7] as [VARCHAR] - [Assassin's Creed II]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [8] as [VARCHAR] - [The lineage continues as this new chapter introduces Ezio, inheritor of the talents and creed of the Assassins. His family murdered by rival families, Ezio resolves to learn the ancient art of the Assassin in order to seek revenge. He will not do so alone though, allying with historical figures such as philosopher and writer Niccolò Machiavelli. You will also be able to master the art of the assassin with all new weapons and instruments created by the renowned inventor and genius of the Renaissance, Leonardo Da Vinci himself.]
2017-07-25 13:09:58.897 TRACE 9442 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [9] as [BIGINT] - [127]
看起来数据绑定到参数,但在H2控制台中,从游戏中选择*返回我: 从游戏中选择*; 未找到桌面游戏;SQL语句: 从游戏[42102-193]42S02/42102帮助中选择*

我尝试过其他H2模式,如CreateDrop或create,但没有成功。让我担心的是,我甚至不能让数据库创建一个包含正确行的空表,为条目做好准备

我认为我的实体有问题,或者我的GameRepository配置中缺少了一些东西,但是我没有更多的想法来修复这个错误

我想实现以下目标: 在这里:

此外,我还尝试了这套教程来进行更改:

但到目前为止运气不好

看起来数据绑定到了参数,但在H2控制台中选择* 从游戏中我一无所获。这个表不存在

您正在使用H2的内存中实例:

spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
在此模式下,您无法查看启动内存中数据库的另一个客户端的更改内容。 要查看其他客户端的更改,必须使用TCP模式

您有两种解决方案:

使用文件持久化H2实例。 数据库文件存储在哪里

当使用像jdbc:h2:~/test这样的数据库URL时,会存储数据库 在用户目录中。对于Windows,这通常是C:\Documents和 设置\或C:\Users\。如果基本目录是 未设置为jdbc:h2:./test中的设置,数据库文件存储在 当前工作目录中启动应用程序的目录 目录从“开始”菜单使用H2控制台应用程序时, 这是垃圾桶。可以在中设置基本目录 数据库URL。可以使用固定或相对路径。当使用 URL jdbc:h2:file:./data/sample,数据库存储在 相对于当前工作目录的目录数据。这个 如果目录尚不存在,则会自动创建该目录。它是 也可以使用完全限定的目录名和 Windows,驱动器名。示例:jdbc:h2:file:C:/data/test

继续使用内存中实例,但使用TCP模式。 替换:

spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
作者:

通常,在JPA实体单元测试期间,当我真的想知道数据库中插入了哪个时,我会切换到这种模式

发件人:

内存数据库

对于某些用例,例如:快速原型、测试、高性能 性能操作,只读数据库,可能不需要 保存数据,或保存对数据的更改。这个数据库 支持内存模式,其中数据不会持久化。

在某些情况下,只需要一个到内存中数据库的连接 必修的。这意味着要打开的数据库是私有的。在这个 在这种情况下,数据库URL是jdbc:h2:mem:Opening内的两个连接 同一个虚拟机意味着打开两个不同的私有 数据库

有时,对同一内存中数据库的多个连接是无效的 必修的。在这种情况下,数据库URL必须包含名称。例子: jdbc:h2:mem:db1。使用此URL访问同一数据库只起作用 在同一虚拟机和类加载器环境中

从另一个进程或从另一个进程访问内存中的数据库 在计算机上,您需要在与服务器相同的过程中启动TCP服务器 创建了内存中的数据库。然后,其他流程需要 通过TCP/IP或TLS访问数据库,使用数据库URL,例如: jdbc:h2:tcp://localhost/mem:db1.

独立H2控制台的替代方案:使用可从Spring Boot应用程序访问的H2控制台

实际上,H2数据库提供了一个基于浏览器的控制台。当出现以下情况时,控制台将自动配置: 满足以下条件:

您正在开发一个基于servlet的web应用程序。 h2数据库:h2位于类路径上。 您正在使用SpringBoot的开发工具。 所以这意味着只有在dev中才可以访问。通常您需要什么

默认情况下,控制台在/h2控制台上可用。 设置spring.h2.console.path属性以更改该属性<
/p> 检查主类Spring引导应用程序类是否能够扫描定义的实体。当实体位于与主类不同的包中时,通常会发生这种情况。

只需转到H2控制台,例如: 在JDBCURL字段中,键入jdbc:h2:mem:testdb以配置与RAM中的testdb数据库的连接。

将这一行:spring.jpa.hibernate.ddl-auto=update放入您的application.properties文件中启动内存数据库和基于文件的h2数据库中的填充数据。希望这对任何人都有帮助。

使用@EntityScancom.db.jpasample.entity

应用程序属性

server.port = 9090
spring.h2.console.enabled=true
spring.datasource.platform=h2
spring.datasource.url=jdbc:h2:mem:socialdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto = create

select*from game returns NOTS表示没有数据,没有表格如果参数被绑定,怎么会没有数据?该表不存在,因为Hibernate拒绝创建它,因为数据中存在错误。是否可以共享包结构?确定:添加方言属性并使用create not update。我知道更新应该创建表,但至少给出了一个try2017-07-25 13:58:41.311错误10690-[restartedMain]o.a.tomcat.jdbc.pool.ConnectionPool:无法创建池的初始连接。org.h2.jdbc.JdbcSQLException:连接断开:java.net.ConnectException:连接被拒绝连接被拒绝:localhost[90067-193]/~/test是因为我在localhost:8080/test下测试数据库?我切换到以下位置:spring.datasource.url=jdbc:h2:file:~/h2/test结果是我不得不使用application.properties中指定的相同url登录到h2-一切正常,非常感谢!使用相同的URL当然更好:不客气。问题在一年前就已经解决了,就像我在对当时公认答案的评论中所写的那样。尽管如此,还是要感谢您的帮助。VapeKop,由于版本更改和其他原因,人们在问题解决后会添加答案。因此,一个新的帖子可能会帮助其他人。
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
@SpringBootApplication
@EntityScan("com.db.jpasample.entity")
public class GsoftApplication {

  public static void main(String[] args) {
    SpringApplication.run(GsoftApplication.class, args);
  }

}
server.port = 9090
spring.h2.console.enabled=true
spring.datasource.platform=h2
spring.datasource.url=jdbc:h2:mem:socialdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto = create