HSQLDB中带有时区的时间戳

时间:2018-08-21 08:00:15

标签: java hibernate hsqldb dbunit

我的项目正在使用postgres,并且还使用hsqldb(2.4.1)对内存进行了一些测试

客户实体具有以下字段:

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(updatable = false)
private Date creationDate;

日期是java.util.Date

使用“带时区的时间戳”创建表

CREATE TABLE client (
  id bigint NOT NULL,
  creationdate timestamp with time zone,
  ...)

当我运行测试时,dbunit正在使用数据加载文件,并且出现此错误:

2018-08-21 09:39:03,194 [warn] o.d.u.SQLHelper - CLIENT.CREATIONDATE data type (2014, 'TIMESTAMP WITH TIME ZONE') not recognized and will be ignored. See FAQ for more information.

所以我认为我应该扩展HSQLDialect以支持它。但是我不知道怎么办,我需要registerColumnType()或registerHibernateType()吗?还是可以选择投放?

1 个答案:

答案 0 :(得分:0)

这是一个发出警告消息的dbUnit类(可能被日志记录框架混淆为“ o.d.u.SQLHelper”)。这意味着dbUnit不支持指定的数据类型。

TL; DR

请创建增强请求以支持此SQL Standard数据类型: https://sourceforge.net/p/dbunit/feature-requests/

具有dbUnit支持的数据类型如果通过测试实现并创建合并请求或附加修补程序,则发生的速度会更快。

详细信息

该消息显示“请参阅常见问题解答”,并且“常见问题解答”页面上有关于该问题的信息: http://dbunit.sourceforge.net/faq.html#typenotrecognized

单击“替换默认数据类型工厂”链接到此常见问题解答条目: http://dbunit.sourceforge.net/faq.html#typefactory

它显示使用特定于数据库的数据类型工厂。
您的数据库是HSQLDB,因此,正如它所提到的,可以在“ org.dbunit.ext.hsqldb”子包中找到其类:http://dbunit.sourceforge.net/xref/org/dbunit/ext/hsqldb/HsqldbDataTypeFactory.html

根据示例配置dbUnit以使用它。 或者,根据您的设置(例如,使用Spring?哪个TestCase?),这是一个有用的示例,另一种方法(此示例是我的典型设置): http://dbunit.sourceforge.net/testcases/PrepAndExpectedTestCase.html#Configuration_Example_Using_Spring

但是,查看HsqldbDataTypeFactory的源表明其中不支持数据类型: http://dbunit.sourceforge.net/xref/org/dbunit/ext/hsqldb/HsqldbDataTypeFactory.html

或其父级: http://dbunit.sourceforge.net/xref/org/dbunit/dataset/datatype/DefaultDataTypeFactory.html

第71行的父级DefaultDataTypeFactory委托给DataType: http://dbunit.sourceforge.net/xref/org/dbunit/dataset/datatype/DataType.html

DataType使用Java API Types类定义了受支持的数据类型: https://docs.oracle.com/javase/8/docs/api/java/sql/Types.html

在“类型”页面上搜索“带时区的时间戳”会发现: https://docs.oracle.com/javase/8/docs/api/java/sql/Types.html#TIMESTAMP_WITH_TIMEZONE

我们看到它是在Java 8中添加的。

在DataType中搜索Types.TIMESTAMP_WITH_TIMEZONE找不到对“带时区的时间戳”的支持。这就是我们知道它丢失的方式。