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

时间:2010-08-12 21:31:55

标签: java logging jpa hql hsqldb

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

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

登录通常似乎正在运行,并且HSQLDB在启动期间非常频繁地将大量其他所有阈值的消息记录到stdout。所以我对于为什么那些不包含必须在某些时候被抛出的明显SQLExceptions感到困惑。

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

2 个答案:

答案 0 :(得分:0)

.script文件(这是权威名称)是在数据库关闭时由HSQLDB创建的,并在重新打开时读取。除了在某些旧版本升级方案中,用户不打算对其进行修改。因此,假设保留数据完整性并最大化加载速度,不对可为空性或参照完整性和不正确的列数进行检查。捕获主键或唯一约束违规,因为数据已插入索引中。

我已经读过提及DBUnit(JUnit的数据库操作的扩展),支持你需要做的事情。

答案 1 :(得分:0)

我认为这不仅仅是因为包含表和其他数据库对象的定义的脚本文件加上非缓存表的数据不应该包含语法不正确的语句(它们应该由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并设置create或   create-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技巧。

相关问题