【问题标题】:Hibernate Timestamp to LocalDateTime conversion unexpected result休眠时间戳到 LocalDateTime 转换意外结果
【发布时间】:2016-12-10 08:31:21
【问题描述】:

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

我正在使用的版本 休眠核心:5.2.1.Final
hibernate-commons-annotations: 5.0.1.Final
hsqldb:2.3.4
弹簧测试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 时它可以工作。

【问题讨论】:

  • 内存数据库使用什么引擎?是不是数据库不支持这样的日期?
  • 自从我开始使用 LocalDateTime 之后,我才遇到了这个问题。我之前使用 java.sql.Timestamp 没有问题。在我的项目的时间戳期间已经存在失败的测试。

标签: java hibernate jpa java-8 hsqldb


【解决方案1】:

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

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

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

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

回读时的结果

2016-08-25T00:00

希望这会有所帮助!

【讨论】:

  • 首先感谢您的回复。我从来没有提到 Hibernate 无法将 Timestamp 解析为 LocalDateTime 对象。问题实际上与我认为的时区有关。
猜你喜欢
  • 2017-12-27
  • 2014-12-12
  • 2015-12-30
  • 1970-01-01
  • 2017-02-12
  • 2014-12-07
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多