You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IDEA控制台显示H2表已创建,但H2控制台无表的问题求助

问题排查:H2控制台看不到已创建的表

IDEA控制台明确输出了Hibernate创建med_pgw和customer表的SQL语句,但登录H2控制台后无法看到这些表。相关信息如下:

实体代码

@Entity
@Table(name = "MED_PGW")
@NoArgsConstructor
@Data
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class MedPgwEntity implements Serializable {

    private static final long serialVersionUID = -1L;
    @Id
    //@GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "key_field")
    private String keyField;

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

    @CreatedDate
    @Column(name = "create_time")
    private Date createTime;


    @LastModifiedDate
    @Column(name = "update_time")
    private Date updateTime;

}

IDEA控制台日志

2024-02-19 16:53:39.261 [] [main] INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Hibernate: drop table if exists customer CASCADE 
Hibernate: drop table if exists med_pgw CASCADE 
Hibernate: drop sequence if exists hibernate_sequence
Hibernate: create sequence hibernate_sequence start with 1 increment by 1
Hibernate: create table customer (id bigint not null, email varchar(255), name varchar(255), primary key (id))
Hibernate: create table med_pgw (key_field varchar(255) not null, body varchar(255), create_time timestamp, update_time timestamp, primary key (key_field))

application.yml配置

spring:
  datasource:
    druid:
#      url: jdbc:h2:mem:test
      url: jdbc:h2:mem:test
      username: med
      password: med
      driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
  h2:
    console:
      enabled: true
    path: /h2-console

H2登录配置

Saved Settings:Generic H2 (Server)
Setting Name:Generic H2 (Server)
Driver Class:org.h2.Driver
JDBC URL:jdbc:h2:mem:test
User Name:med
Password:med

可能原因及解决办法

1. 内存模式H2的进程隔离问题

H2的mem模式数据库默认是进程内私有的,只能被创建它的JVM进程访问。如果H2控制台通过独立进程(如Generic H2 Server)连接,会和应用JVM处于不同进程,无法看到应用创建的内存数据库。

解决方法:
修改数据库URL,添加参数让内存数据库支持跨进程访问并保持存活:

spring:
  datasource:
    druid:
      url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

同时将H2控制台的JDBC URL改为完全一致的内容,确保连接到同一个内存数据库。

2. create-drop配置导致表被删除

当前jpa.hibernate.ddl-auto设置为create-drop,该配置会在应用停止时自动删除所有表。若应用已停止,内存数据库中的表会直接消失。

解决方法:
确保应用处于运行状态时再登录H2控制台查看。若需要持久化表,可将ddl-auto改为create或update(根据需求选择):

spring:
  jpa:
    hibernate:
      ddl-auto: create

3. Schema选择错误

H2默认使用PUBLIC schema,若在控制台中切换到其他schema,会看不到PUBLIC下的表。

解决方法:
登录H2控制台后,在左侧Schema下拉框选择PUBLIC,点击右上角Refresh按钮刷新表列表。

4. 切换到文件模式(推荐调试用)

内存模式限制较多,可改用文件模式H2数据库,数据会持久化到本地文件,跨进程可访问且重启应用后数据不丢失。

修改配置:

spring:
  datasource:
    druid:
      url: jdbc:h2:file:./h2-data/test;DB_CLOSE_DELAY=-1

H2控制台的JDBC URL对应改为:jdbc:h2:file:./h2-data/test,登录后即可看到创建的表。

内容的提问来源于stack exchange,提问作者kylin Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:33:33