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
相关产品推荐
相关产品推荐

