Hibernate Timestamp到LocalDateTime转换意外结果

时间:2016-08-04 09:30:46

标签: java hibernate jpa java-8 hsqldb

我将1000-01-01 00:00:00.0转换为LocalDateTime对象时出现问题。我已经检查了Oracle docs,看看是否支持1000-01-01,但这似乎不是问题。

我使用的版本 hibernate-core:5.2.1.Final
hibernate-commons-annotations:5.0.1.Final
hsqldb:2.3.4
spring-test-dbunit:1.2.0

这就是startDate在MyEntity.class中的外观

@Basic
@Column(name = "start_date", nullable = false)
public LocalDateTime getstartDate() {
    return startDate;
}

Hibernate像这样创建它:

Query:[create table my_table (end_date timestamp not null, start_date timestamp not null)]

我有一个(示例)数据集,其中包含以下行

<my_table startDate="1000-01-01 00:00:00.0" endDate="4000-01-01 00:00:00.0" />

DBUnit正在使用Hibernate

在内存数据库中加载数据
Query:["insert into my_table(START_DATE, END_DATE) values (?, ?)"]
Params:[(1=1000-01-01 00:00:00.0,2=4000-01-01 00:00:00.0)]

在我的JUnit测试中,我使用(Hibernate)Entitymanager获取数据并遵循命名查询:

@NamedQuery(
            name = "MyTable.fetchAll",
            query = "FROM MyTable m"
)

选择查询(简化):

Query:["select end_date as date_e12_4_, start_date as date_s13_4_ from my_table mytable0_"]

在我的JUnit测试中,我断言返回的结果,但是我得到一个AssertionError:

java.lang.AssertionError: 
Expected :MyEntity{startDate=1000-01-01T00:00, endDate=4000-01-01T00:00}
Actual   :MyEntity{startDate=1000-01-05T23:09:21, endDate=4000-01-01T00:00}

我的startDate 1000-01-01T00:00变为1000-01- 05T23:09:21
endDate不会出现问题。

以前有人有这个问题吗?或者有谁知道如何解决它? 如果您需要更多信息,请与我们联系。 非常感谢任何帮助。

更新:当我使用LocalDate而不是LocalDateTime时,它可以正常工作。

1 个答案:

答案 0 :(得分:1)

对于Java 8中的新类型,您需要Hibernate的另一个依赖项。

    html, body{
      overflow:initial !important;
    }

添加后,使用LocalDateTime,就像普通的Basic类型一样。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>5.0.1.Final</version>
</dependency>

<强>更新 我试着重现你的情况。 以下是我实施课程的方法。

private LocalDateTime validFrom;

数据库中的数据

@Entity
public class MyTable extends ABaseEntity {

private LocalDateTime startDate;

@Type(type="org.hibernate.type.LocalDateTimeType")
public LocalDateTime getStartDate() {
    return startDate;
}

public void setStartDate(LocalDateTime startDate) {
    this.startDate = startDate;
}

}

我回读时的结果

ID  STARTDATE
1   25-AUG-16 12.00.00.000000000 AM

希望这会有所帮助!