![](/img/trans.png)
[英]UTC Unix timestamp storage in HSQLDB from Java program in wrong timezone
[英]Timestamp with timezone in HSQLDB
我的项目正在使用postgres,并且在hsqldb(2.4.1)中也进行了一些内存测试
客户实体具有以下字段:
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(updatable = false)
private Date creationDate;
其中Date是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()吗? 或者也许是一些铸造?
它是一个发出警告消息的dbUnit类(可能被日志记录框架混淆为“ oduSQLHelper”)。 这意味着dbUnit不支持指定的数据类型。
请创建增强请求以支持此SQL Standard数据类型: https : //sourceforge.net/p/dbunit/feature-requests/
如果使用测试实现dbUnit支持并创建合并请求或附加补丁程序,则此数据类型的发生速度会更快。
该消息显示为“请参阅FAQ”,并且FAQ页面包含有关该问题的信息: http : //dbunit.sourceforge.net/faq.html#typenotrecognized
单击“替换默认数据类型工厂”链接到此FAQ条目: 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中添加的。
在数据类型中搜索Types.TIMESTAMP_WITH_TIMEZONE找不到对“带时区的时间戳”的支持。 这就是我们知道它丢失的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.