Spring Boot + IntelliJ + 嵌入式数据库 = 头痛

30

我可能错过了一些核心概念(Spring、Spring Boot、H2、HSQLDB、Derby、IntelliJ)或者已经盯着这个问题看太久了。我正在进行一个Spring Boot项目。我首先尝试使用和初始化H2数据库,尝试在IntelliJ中连接它,但发现我可能无法轻松浏览数据库而不放弃我的第一个孩子 (Connect to H2 database using IntelliJ database client)。

所以我转向DerbyDB。同样的问题-在我的应用程序中创建了db根文件夹,在IntelliJ中连接到它,但是我刚刚从启动应用程序创建的表无法浏览。

我甚至尝试了SQLite,但对SQLite的支持并不好,并且某些更新功能不可用,但是我至少可以在IntelliJ浏览器中找到我的表!

我只想要一个简单的单文件嵌入式数据库,可以轻松地使用、浏览和操作。有什么建议吗?!

当我运行应用程序时,我发现模式已被导出:

2015-07-19 09:37:45.836  INFO 98608 --- [ost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000227: Running hbm2ddl schema export
Hibernate: drop table user_roles if exists
Hibernate: drop table users if exists
Hibernate: create table user_roles (id bigint generated by default as identity, role_name varchar(255), version bigint, user_id bigint, primary key (id))
Hibernate: create table users (id bigint generated by default as identity, email varchar(255), password varchar(255), username varchar(255), version bigint, primary key (id))
Hibernate: alter table user_roles add constraint FK_g1uebn6mqk9qiaw45vnacmyo2 foreign key (user_id) references users
2015-07-19 09:37:45.849  INFO 98608 --- [ost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000230: Schema export complete
在IntelliJ中,按照heenenee的建议使用远程源jdbc:h2:./test;AUTO_SERVER=TRUE时,没有任何问题:

enter image description here

有一些人投票关闭此问题,因为不清楚我的问题所在:

我如何使用H2、HSQLDB或Derby数据库开发应用程序,并使用IntelliJ连接到它们?


使用./test作为路径将会创建两个数据库:一个在您的Spring Boot项目工作目录中,另一个在IntelliJ的工作目录中(或者附近)。在两个地方都使用~/test,这样两个URL指向文件系统上的同一位置。 - heenenee
5个回答

27

H2数据库的自动混合模式 对你来说应该是很好的选择。将 jdbc:h2:~/mydbInHomeDir;AUTO_SERVER=TRUE 设为你的 spring.datasource.url。在 IntelliJ 中,创建一个远程 H2 数据源,并使用完全相同的JDBC URL。你可能需要在 IntelliJ 数据库窗口中显式地按下“Synchronize”按钮才能显示数据库表。


这对我有用。谢谢。有关AUTO_SERVER模式的更多详细信息,请访问[链接] http://www.h2database.com/html/features.html#auto_mixed_mode - Vladimir
如果数据库是内存中的,你有什么建议吗?我有一个H2内存数据库,其中包含public.roles表,但当我从Intellij运行查询时,它显示:“Table“ROLES”not found; SQL statement:”。我认为IDEA正在创建自己的内存数据库,而不是尝试连接我的项目中的那个。 - valijon
访问控制台的方法是:http://localhost:8080/h2-console。然后在“JDBC URL”字段中,也输入 jdbc:h2:~/mydbInHomeDir;AUTO_SERVER=TRUE - Hugo P
1
对于后来发现这个问题的任何人:REMOTE 部分非常重要。IntelliJ 会将其设置回嵌入式。 - TiltedBlock

8

补充heenenee上面所提到的内容。如果您不指定AUTO_SERVER,则只允许一个连接到您的H2实例。

我正在使用spring-boot和spring-data-jpa。请确保为代表每个表格的实体声明@Entity。

以下是我的application.yml/application.properties文件:

spring.datasource.url: 
jdbc:h2:file:/Users/blah[![enter image description here][1]][1]/db/vlad4;AUTO_SERVER=TRUE
spring.datasource.username: sa
spring.datasource.password:

spring:
  jpa:
    hibernate:
      ddl-auto: create #will create schema based on entities
    show-sql: true

开始你的应用程序并将一些数据导入其中。如果你的类路径中有import.sql,Spring Boot会自动导入你的数据。 例如:/src/main/resources/import.sql
配置你的IntelliJ如下图所示: enter image description here 如果你不使用IntelliJ,请下载服务器/客户端组合 http://www.h2database.com/html/download.html, 然后解压并使用基于浏览器的客户端启动它。
h2/bin: java -cp h2*.jar org.h2.tools.Server

通过指定连接字符串连接到您的嵌入式数据库: 在这里输入图片描述


太好了,它起作用了,谢谢!你能帮我使用DriverManager.getConnection连接到这个数据库吗?我已经将相同的AUTO_SERVER=TRUE添加到URL中,但它仍然看不到表 :( - Katia Savina
更新:问题已解决。当时数据库由于某种原因被重新创建了。只需再次创建一个表,应用程序最终找到了它。 - Katia Savina

5
我遇到了类似的问题。这是由于Hibernate默认使用create-drop ddl策略导致的。使用该策略后,应用程序关闭时Hibernate会在会话结束时销毁模式,这就是为什么IntelliJ不显示任何内容的原因。将ddl策略更改为create,Hibernate将在下一次应用程序启动时创建模式并销毁以前的数据。
以下是我的配置示例: application.yml
spring:
  datasource.url: jdbc:h2:./db/testDb
  jpa.hibernate.ddl-auto: create

IntelliJ数据库属性

enter image description here

结果

enter image description here


谢谢你,也许它会帮助到别人。我已经转向其他框架了。 - Jack

2

2
你能提供另一个链接吗?因为你上面提到的那个链接已经过期了,它正在重定向到其他地方。 - valijon
3
这种情况说明了在stackoverflow回答中编写解决方案要比链接到可能会消失的外部网站更好。 - devdanke

0
使用此示例将内存数据库通过控制台和TCP公开,我能够像截图中显示的那样使用H2控制台和IntelliJ客户端进行连接。

https://dev59.com/E1QJ5IYBdhLWcg3w2ZxT#52949164

使用IntelliJ连接 - jdbc:h2:tcp://localhost:9092/mem:default IntelliJ数据库连接

使用H2控制台连接:jdbc:h2:mem:default H2控制台 - 登录 H2控制台

示例application.yml

spring:
  application:
    name: example-service
  r2dbc:
    url: r2dbc:pool:h2:mem:///default?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    username: testuser
    password: testpass
    pool:
      initial-size: 100
      max-size: 500
      max-idle-time: 30m
      validation-query: SELECT 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接