当前位置: 首页 > 知识库问答 >
问题:

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

杜英范
2023-03-14

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

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

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

这是我的实体,游戏。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;
    }


}

这是封面。java类:

@Embeddable
public class Cover {

    @Column (name = "URL")
    private String url;
    @JsonProperty("cloudinary_id")
    @Column (name = "CLOUDINARY_ID")
    private String cloudinaryId;
    @Column (name = "WIDTH")
    private Integer width;
    @Column (name = "HEIGHT")
    private Integer height;

    public Cover(){
    }

    public Cover(String url, String cloudinaryId, Integer width, Integer height) {
        this.url = url;
        this.cloudinaryId = cloudinaryId;
        this.width = width;
        this.height = height;
}

    public String getUrl() {
        return url;
    }

    public String getCloudinaryId() {
        return cloudinaryId;
    }

    public Integer getWidth() {
        return width;
    }

    public Integer getHeight() {
        return height;
    }

}

我在这里配置了H2数据库,在应用程序中。属性文件:

spring.h2.console.enabled=true
spring.h2.console.path=/h2_console
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

存储库的配置如下:

import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface GameRepository extends CrudRepository<Game, Long> {
    List<Game> findAllByName(String name);
}

我通过在localhost:8080/test下测试我的存储库,其中一个示例条目应该插入到表中:

@RequestMapping("/test")
public String saveSth(){
    gameRepository.save(new Game(127, "Assassin's Creed II", "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.", 90.25, 1258416000000L, new Cover("//images.igdb.com/igdb/image/upload/t_thumb/doczeiofd1ckpapdhqs7.jpg", "doczeiofd1ckpapdhqs7", 1000, 1426)));
    return "success";
}

我得到以下日志:

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控制台SELECT*From GAME返回我:SELECT*From GAME;表"GAME"未找到;SQL语句:SELECT*From GAME[42102-193] 42S02/42102(帮助)

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

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

我想实现以下目标:http://javasampleapproach.com/spring-framework/spring-boot/integrate-h2-database-springboot-spring-jpa-embedded-mode这里:http://www.simplecodestuffs.com/value-object-entity-object-in-hibernate-mapping/

此外,我还尝试了这套教程来进行更改:https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/ https://springframework.guru/spring-boot-web-application-part-3-spring-data-jpa/

但到目前为止运气不好。

共有3个答案

曹昊焱
2023-03-14

放这行:spring。jpa。冬眠应用程序中的ddl auto=update。属性文件在内存数据库和H2数据库的基于文件的数据库中启动填充数据。希望这对任何人都有帮助。

万俟棋
2023-03-14

看起来数据是绑定到参数的,但在H2控制台中,SELECT*FROM GAME不会返回任何结果。该表不存在。

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

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

在这种模式下,您无法看到另一个客户端的更改内容,即启动内存中数据库的客户端
要查看其他客户端的更改,必须使用TCP模式

你有两个解决方案:

  • 使用文件持久化H2的实例。

数据库文件存储在哪里?

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

  • 继续使用内存实例,但使用TCP模式

替换:

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

签署人:

spring.datasource.url=jdbc:h2:tcp://localhost/~/test

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

来自官方留档:

内存数据库

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

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

有时需要多个连接到同一内存数据库。在这种情况下,数据库URL必须包含名称。示例:jdbc:h2:mem:db1。使用此URL访问同一数据库只能在同一虚拟机和类加载器环境中工作。

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

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

实际上,H2数据库提供了一个基于浏览器的控制台,Spring Boot可以为您自动配置。当满足以下条件时,控制台自动配置:

  • 您正在html" target="_blank">开发一个基于servlet的web应用程序

所以这意味着只有在dev中才可以访问。通常您需要什么。

默认情况下,控制台可在/h2控制台
设置spring.h2.console.path属性来更改它。

公西运良
2023-03-14

只需转到H2控制台,例如:http://localhost:9090/h2-控制台/并在JDBC URL字段中,键入JDBC:h2:mem:testdb以配置到RAM中的testdb数据库的连接。

 类似资料:
  • 我想做一个,让用户个性化应用的外观。在这项活动中,用户可以选择将应用程序保持在“光主题”(例如,白色背景和黑色文本)或“暗主题”,即光主题的相反颜色,以利于夜间使用。 怎么可能做到呢? 我正在考虑在xml中为每个主题创建不同的布局。 编辑 下面的图像是的示例,我想更改整个应用程序的外观,而不是单个活动。

  • 我刚刚安装了NetBeans 7.3.1。我只是试图创建一个新的Java应用程序,但每当我通过向导时,它会显示“Project folder exists and is not Empty”(项目文件夹存在且不是空的),不会再继续了。这是一个新项目,所以在NetBeans创建文件夹之前,文件夹是不存在的。 有什么想法吗?

  • 问题内容: 嗨伙计, 如何在Eclipse中创建我的应用程序的exe文件?请提及要遵循的步骤。 谢谢 问题答案: 如果您只是想知道如何在Eclipse IDE外部运行应用程序,则不需要exe。在菜单中寻找“导出JAR”选项。 如果导出正确完成(生成了MANIFEST),则应该能够通过双击JAR文件或从命令行使用“ java -jar FILENAME.jar”来运行JAR文件。请注意,这是与平台无

  • 我试图将H2连接到我的MVC Spring boot应用程序,H2和应用程序之间的连接正在工作,但H2控制台中没有创建表。 我试图在主类上方添加ScanEntity(“包名”),但什么都没有发生。 我的pom。xml: H2控制台中没有表:

  • OS:Windows 10 JDK:jdk1。8.0_65 IDE:Netbeans 8.2 我采取的步骤: 1。我安装了Netbeans,选择了ALL列,这意味着它可以支持Groovy或grails应用程序 2。我还安装了Grails的最新版本,即Grails-3.3.5 3。安装完所有东西后,我打开了Netbeans。 我在NETBEANS 文件中采取的步骤 这里的问题是我无法创建一个新项目。

  • 问题内容: 我被要求为一个很大的SpringBoot项目中的服务创建一个集成测试,该项目会产生许多已实现的服务。执行该应用程序时,将部署所有这些服务- 我想避免部署与我正在为其创建测试的服务无关的所有服务。不幸的是,我对弹簧启动测试的经验还不如我所希望的那么多,因此我想知道解决这个问题的最佳方法是什么。 我当时正在考虑使用注解对所有不相关的服务进行注释,并在测试类中对所有相关的服务进行注释,但是我