繁体   English   中英

HSQLDB中带有时区的时间戳

[英]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不支持指定的数据类型。

TL; DR

请创建增强请求以支持此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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM