使用 jdbcTemplate 在嵌入式 hsqldb 中测试插入行时出错

Posted

技术标签:

【中文标题】使用 jdbcTemplate 在嵌入式 hsqldb 中测试插入行时出错【英文标题】:Error while testing Insert row in embedded hsqldb with jdbcTemplate 【发布时间】:2016-12-13 16:02:55 【问题描述】:

我正在测试我的应用程序的创建方法。 在测试中我嵌入了 hsql db ,并使用 Spring jdbcTemplate

<jdbc:embedded-database id="dataSource" type="HSQL">
    <jdbc:script location="classpath:/sql/db/db-schema.sql"/>
    <jdbc:script location="classpath:/sql/db/db-data.sql"/>
</jdbc:embedded-database>

db-data.sql 在哪里

INSERT INTO C_ContactType(name) VALUES ('bob_eng991');
INSERT INTO C_ContactType(name) VALUES ('bob_eng2');
INSERT INTO C_ContactType(name) VALUES ('bob_eng3');
INSERT INTO C_ContactType(name) VALUES ('bob_eng422');

db-schema.sql 是

  CREATE TABLE C_ContactType (
  contactTypeId INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  name VARCHAR(90) NOT NULL,
  deletedOn DATETIME,
  deletedBy INT
  );

我的测试是

@Test
void test_createClassifier() 

    mockMvc.perform(MockMvcRequestBuilders.post("/classifiers/category",  "ContactType")
            .contentType(MediaType.APPLICATION_JSON)
            .param("languageId", String.valueOf(3))
            .content(" \"name\": \"bob_eng100\"".getBytes()))
            .andExpect(status().isOk())


运行测试我在这里遇到错误

ResultSet rs = jdbcTemplate.insertWithKey(tablePath,
            insert -> insert.columns(paths.toArray(new Path[paths.size()]))
                    .values(params.toArray(new Object[paths.size()]))
                    .executeWithKeys());

其中 tablePath 表示 "C_ContactType" , 路径是一个 ArrayList,我的表列除了 autoIncrement 字段, 并且 params 是一个带有值的 ArrayList(autoIncrement 字段除外)

还有日志

Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: contactTypeId
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.Table.getColumnIndex(Unknown Source)
at org.hsqldb.Table.getColumnIndexes(Unknown Source)
at org.hsqldb.StatementDML.setGeneratedColumnInfo(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 82 more

【问题讨论】:

【参考方案1】:

错误显示框架请求的列的名称。名称是混合大小写的contactTypeId

您的表声明在表名和列名周围没有双引号字符,因此数据库引擎会将名称转换为大写。您需要更改表定义:

CREATE TABLE C_ContactType (
"contactTypeId" INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,

【讨论】:

谢谢,我会试试的,但我也有数据更新测试,它们表现正常 HSQLDB SVN /base/trunk 中的最新代码应该可以在不更改表定义的情况下工作

以上是关于使用 jdbcTemplate 在嵌入式 hsqldb 中测试插入行时出错的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式 hsql 的有趣之处

在内存数据库中嵌入 HSQL 的 Spring DataSource 和 Linux 上的休眠创建-删除排序

HSQL 访问被拒绝加载文件

HSQL 嵌入式数据库

HSQL - 识别打开连接的数量

如何在应用程序外部连接/查询 HSQL 数据库?