H2
H2 内存数据库
H2是纯JAVA编写的轻量级数据库
本地启动并连接H2数据库
h2单测sql报错时,可以通过下面方法手动启动h2数据库,手动执行sql看是否有语法错误
方法1、
进入 .m2/repository/com/h2database/h2/1.4.200 目录
执行 java -jar h2-1.4.200.jar 会前台启动 h2 数据库,同时会打开一个 h2 控制台页面
http://localhost:8082/login.jsp?jsessionid=21627d0f645cca6b1fe8ae7a6acf7a64
用户名 sa 密码为空,直接可连接进入控制台
方法2、
进入 .m2/repository/com/h2database/h2/1.4.200 目录
java -classpath h2-1.4.200.jar org.h2.tools.Server -tcp 前台启动 h2 数据库,提示连接地址为 tcp://localhost:9092
再开一个窗口 java -classpath h2-1.4.200.jar org.h2.tools.Console -web 前台启动web客户端
http://localhost:8082?key=ca0c8c7c14ac9c291b2b3f8bbce14001b1e2d5431bfe97659bc268d0bbc4dbaf
用户名 sa 密码为空,直接可连接进入控制台
问题
DEFAULT 语句不能在 COMMENT 之后
单测报错:
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "
...
name VARCHAR(10) COMMENT '名字' DEFAULT 'system' NOT NULL,
...
" expected "[, ::, *, /, %, +, -, ||, ~, !~, NOT, LIKE, ILIKE, REGEXP, IS, IN, BETWEEN, AND, OR, CONSTRAINT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, ,, )"
[42001-195]
原因:
JPA 实体类定义的下面这种写法,会导致 DEFAULT 语句在 COMMENT 之后,从而不符合 h2 语法,报错
@ColumnDefault("'system'")
@Column(columnDefinition = "varchar(10) COMMENT '名字'")
private String name;
解决:
去掉 @ColumnDefault(“‘system’”),默认值写到 columnDefinition 中
@Column(columnDefinition = "varchar(10) DEFAULT 'system' COMMENT '名字'")
private String name;
Index “idx_xxx” already exists
单测报错:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Index "IDX_NAME" already exists; SQL statement:
create index idx_name on student (name) [42111-200]
原因:
不同表上有同名索引 IDX_NAME
@Data
@Entity
@Table(name = "student", indexes = {
@Index(name = "idx_name", columnList = "name")})
public class StudentDO {
}
@Data
@Entity
@Table(name = "teacher", indexes = {
@Index(name = "idx_name", columnList = "name")})
public class TeacherDO {
}
而 H2 的 key 或者 unique key 是数据库级别而非表级别,因此两张表内存在同名 key 会遇到这个报错,需要保证数据库内key的命名唯一。
解决:
修改同名索引
https://coderec.cn/2016/08/09/单元测试之使用H2-Database模拟数据库环境/
上一篇 LLM 大语言模型
下一篇 Hutool
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: