java - DBUnit 在 H2 表中插入时间戳默认值解析错误

标签 java hibernate timestamp h2 dbunit

当我尝试使用 DBUnit 将记录插入 H2 表时,出现以下异常:

Caused by: org.h2.jdbc.JdbcSQLException: 
  Cannot parse "TIMESTAMP" constant "1970-00-01"; 
  SQL statement: insert into PUBLIC.TABLE (COLX, COLY, COLZ) values (?, ?, ?)
Caused by: java.lang.IllegalArgumentException: 
  1970-0-1 at org.h2.util.DateTimeUtils.parseDateValue(DateTimeUtils.java:276)

没有一个值适用于所需的时间戳列,因此 dbUnit 似乎尝试插入一个默认值,这会引发问题。 注意:1970-0-1 不是表格描述中的 1970-00-01(见下文)。

我不确定在哪里可以配置该行为。无论如何,她是我的一些设置,可以帮助识别错误:

创建声明:

create table MYTABLE (
    "UUID" binary default random_uuid() not null,
    "COL2" varchar(18) not null,
    "COL3" varchar(20),
    "COL4" timestamp default '1970-00-01',
    ...

DataSet XML(如上所述,三个值不包括时间戳列)

<dataset>
  <MYTABLE COLX="text" COLY="1" COLZ="Text"/>

我也设置了

dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new H2DataTypeFactory());

我想到了两种可能性: 1. dbUnit 是否尝试解析列信息中的值? 2. dbUnit 中是否有标准的默认时间戳/日期字段生成器?

那么我需要做什么才能获得正确的默认值将被插入?

最佳答案

没有月份 0。一月是月份 1。因此您需要使用 '1970-01-01' 而不是 '1970-00-01'

关于java - DBUnit 在 H2 表中插入时间戳默认值解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190580/

相关文章:

java - OAuth java 实现,缺少 oauth_callback

java - spring @Transactional 不为 rollbackFor=Exception.class 回滚

java - 如何声明或标记 Java 方法已弃用?

hibernate - 在实体中找不到@IdClass 的属性

Oracle - 检索具有时间戳值的日期

python-2.7 - 更改python中时间戳的格式

java - 如何摆脱 InvalidClassException SerialVersionUID?

java - 更新多行 - Hibernate

java - MappedSuperclass 和 Embeddable 之间有什么区别,我们应该如何使用

c++ - 两台机器之间时间戳的最佳 C++ 计时函数是什么