无法从 JUnit 访问 HSQLDB 表

Posted

技术标签:

【中文标题】无法从 JUnit 访问 HSQLDB 表【英文标题】:accessing HSQLDB table from JUnit not possible 【发布时间】:2013-01-11 10:53:25 【问题描述】:

我的单元测试失败是因为我无法访问之前刚刚创建的表。

从控制台的输出中,我可以看到执行了以下 Hibernate 命令。

Hibernate: alter table Server_Node drop constraint FK3621657E1249AF15
Hibernate: alter table Server_Node drop constraint FK3621657E2528B004
Hibernate: drop table EmailAccountSettings if exists
Hibernate: drop table Node if exists
Hibernate: drop table Server if exists
Hibernate: drop table Server_Node if exists
Hibernate: create table EmailAccountSettings (id varchar(255) generated by default as identity (start with 1), description varchar(255), name varchar(255), primary key (id))
Hibernate: create table Node (id bigint generated by default as identity (start with 1), name varchar(255), primary key (id), unique (name))
Hibernate: create table Server (id integer generated by default as identity (start with 1), name varchar(255), primary key (id), unique (name))
Hibernate: create table Server_Node (Server_id integer not null, nodes_id bigint not null, primary key (Server_id, nodes_id))
Hibernate: alter table Server_Node add constraint FK3621657E1249AF15 foreign key (nodes_id) references Node
Hibernate: alter table Server_Node add constraint FK3621657E2528B004 foreign key (Server_id) references Server
Hibernate: insert into Server (id, name) values (default, ?)

如您所见,值被插入到表 Server 中。但是下一个测试用例试图在表EmailAccountSettings 中插入一些东西,这会导致以下错误。

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: user lacks privilege or object not found: EMAILACCOUNTSETTINGS
  at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377)
  at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
  at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:273)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  ...

知道EmailAccountSettings 表有什么问题吗?

我使用 Spring + Hibernate + HSQLDB + JUnit 只是为了概述所涉及的组件。

【问题讨论】:

【参考方案1】:

找到这个问题的原因。再看一下建表语句一下子亮了。

Hibernate: create table EmailAccountSettings (id varchar(255) generated by default as identity (start with 1), description varchar(255), name varchar(255), primary key (id))

无法创建数据类型为varchar 的标识列。因此,声明没有成功。但这在运行测试时在控制台中不可见。

更改实体中的数据类型后,一切都按预期工作。

【讨论】:

以上是关于无法从 JUnit 访问 HSQLDB 表的主要内容,如果未能解决你的问题,请参考以下文章

SimpleJdbcInsert由于自动生成的ID(HSQLDB)为空而无法插入

HSQLDB:由于“用户缺少权限或找不到对象”,无法删除互锁表且无法删除外键

无法从 hsqldb 日志文件恢复

Spring boot 无法启动 HSQLDB

无法从应用程序使用 hsqldb 连接,但单元测试工作

HSQLDB 无法使用 android 连接到 db 脚本?