如何让 HSQLDB 在从 .script 文件初始化数据源期间发出错误消息?

Posted

技术标签:

【中文标题】如何让 HSQLDB 在从 .script 文件初始化数据源期间发出错误消息?【英文标题】:How to get HSQLDB to emit error messages during initialization of a datasource from a .script file? 【发布时间】:2010-08-12 21:31:55 【问题描述】:

我正在开发一个 Java 应用程序,该应用程序将使用由 HSQLDB 数据源 (DBCP BasicDataSource) 支持的一些 Hibernate(由 JPA 注释)类。我正在尝试手动调整 HSQLDB“.script”文件(我一生都无法通过网络搜索/阅读文档找到权威名称;它只是顺便提及)以快速添加一些新的 -用于测试的内存表。问题是,当 HSQLDB 运行此脚本时发生的任何错误似乎都不会在任何地方报告或记录。例如,如果我在该 .script 中有一个 INSERT 语句(设置初始数据集的一种非常常见的使用场景),并且它存在问题(例如不正确的日期格式、不正确的列数等),则没有有报道过,也不例外。稍后我才注意到,当我在测试用例中构造的 HQL 查询由于 NULL 结果而引发异常时,程序没有预料到,因为此时数据集应该被正确初始化。

我什至发现 INSERT 语句存在问题的唯一原因是通过在 HSQLDB 数据源上的原始 SQLConnection 上执行它们,而不是在 .script 文件中执行它们,并观察引发的 SQLExceptions点。

一般来说,日志似乎正在工作,并且 HSQLDB 在启动期间非常频繁地将大量其他所有阈值的消息记录到标准输出。所以我很困惑为什么那些不包括在某些时候必须抛出的明显 SQLExceptions。

有什么想法可以尝试吗?也许我缺少一些配置?我尝试通过 HSQLDB 文档搜索所有内容均无济于事,但这并不一定意味着答案不存在。如果它很重要,我试图让它工作的使用场景是在 JUnit 测试用例中初始化的 Spring 应用程序上下文(通过 FileSystemXmlApplicationContext 对象)。感谢您的帮助。

【问题讨论】:

【参考方案1】:

我不认为这只是因为包含表和其他数据库对象的定义以及非缓存表的数据的脚本文件不应该包含语法错误的语句(它们应该是由 HSQLDB 自己编写的)。

但由于您使用的是 Hibernate,我的建议是使用 Rotterdam JBug and Hibernate's import.sql 博客文章中宣布的 import.sql 功能:

import.sql: easily import data in your unit tests

Hibernate 有一个简洁的小功能 这是严重缺乏记录和 未知。您可以执行 SQL 脚本 在SessionFactory 创建期间 在数据库模式之后 生成以全新方式导入数据 数据库。你只需要添加一个文件 在您的类路径中命名为 import.sql root 并设置 createcreate-drop 作为你的 hibernate.hbm2ddl.auto 属性。

现在我已经开始使用它了 Hibernate Search in Action 查询章节。它初始化我的 具有一组新数据的数据库 我的单元测试。 JBoss Seam 也使用它 在各种例子中有很多。 import.sql 是一个非常简单的功能 但有时非常有用。记住 SQL 可能依赖于 您的数据库(啊可移植性!)。

#import.sql file
delete from PRODUCTS
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...');
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');

有关此的更多信息 功能,检查Eyal's blog,他 写了一个很好的关于它的小条目。 记住如果你想添加额外的 数据库对象(索引、表和 等等),你也可以使用辅助 数据库对象功能。

另一种选择是使用DbUnit。但如果(非)可移植性不是问题,我会使用import.sql 技巧。

相关问题

How to execute differnet import.sql in Hibernate/JPA for each persistence unit?

【讨论】:

非常感谢。我将研究 import.sql 方法。奇怪的是(或者可能不是),一旦我发布了我的原始问题,阅读 .script DID 时引发的异常就开始被记录。 =)【参考方案2】:

.script 文件(这是权威名称)在数据库关闭时由 HSQLDB 创建,并在重新打开时读取。除某些旧版本升级场景外,不打算由用户修改。因此,假设数据完整性得到保留,并且为了最大限度地提高加载速度,不对可空性或引用完整性以及不正确的列数进行检查。由于数据被插入到索引中,因此会捕获主键或唯一约束违规。

我读过 DBUnit(JUnit 数据库操作的扩展)支持您需要做的事情。

【讨论】:

好的,感谢您提供的信息。我想我一直有手动调整文件的习惯,当我看到 HSQLDB 本身将 INSERT/CREATE TABLE 语句放入 .script 文件时,我想,为什么不添加我自己的呢?现在我更好地理解这个文件不是为最终用户修改而设计的,应该被认为是 HSQLDB 工作的内部文件。

以上是关于如何让 HSQLDB 在从 .script 文件初始化数据源期间发出错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB .script 文件

hsqldb *.script.new 创建和删除

HSQLDB:.script 文件在多个项目执行[多线程环境]并行期间自动被删除?

JBOSS + HSQLDB 设置.script

HSQLDB 在检查点期间在 db.script.new 文件上抛出 Asset failed 异常和文件 io 错误

从 HSQLDB 获取 ddl sql-script 的最简单方法是啥?