我的项目正在使用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()吗?还是可以选择投放?
答案 0 :(得分:0)
这是一个发出警告消息的dbUnit类(可能被日志记录框架混淆为“ o.d.u.SQLHelper”)。这意味着dbUnit不支持指定的数据类型。
请创建增强请求以支持此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找不到对“带时区的时间戳”的支持。这就是我们知道它丢失的方式。