2017-07-27 96 views
1

我正在使用Hibernate在内存数据库中的H2上编写测试代码。我有两个项目几乎完全相同的配置。在每个测试代码中,模型类自动构建数据库模式。这两个类定义的数据类型相同的方式:Hibernate在时态返回类型中不一致(日期与时间戳)

@Temporal(TemporalType.TIMESTAMP) 
@Column("MY_DATE") 
private java.util.Date myDate; 

从Hibernate的调试日志,我可以看到创建的列是同一类型的两个项目:

create table MY_TABLE (
    ... 
    MY_DATE timestamp, 
    ... 
) 

测试模型总是给定类型java.sql.Date

的对象出于某种原因,但是,在一个项目中,当我和一个Hibernate查询检索数据,类型为java.sql.Date,而在其他的项目,它是java.sql.Timestamp

什么可能导致这种行为差异,以及如何一致地将此数据作为java.sql.Date

(请记住,我只测试代码的控制,我不能改变应用代码。)

回答

0

当执行一个Hibernate查询,如果它显示了一个java.sql.Date例如,它是在Hibernate会被缓存的实例,而不是实际从持续的数据重新组合。当它返回java.sql.Timestamp实例时,实际上这是基于Temporal(TemporalType.TIMESTAMP)从持久数据中组合而来的。要始终如一地获得Timestamp,请确保在查询数据之前使用Session.evict。在问题的参数范围内,不可能始终获得Date实例(即需要更改应用程序代码)。

(感谢,并upvotes奔,为把我在正确的轨道上。)

2

我不确定知道为什么它们会受到不同回来 - 你看到的这种行为在两个项目之间的所有类似日期字段中?这就是说 - 尽管它们的回归方式不同,但是你提到你想要一直回到java.sql.Date - 这不是它们如何映射的。基于你的应该预期会回来的映射的正确类型是java.sql.Timestamp。如果你想java.sql.Date你应该使用@Temporal(TemporalType.DATE)

无论哪种方式 - 在您的代码中,您应该只针对java.util.Date而不是针对底层的java.sql.*类进行编码。

更为理想的是,如果您使用Java 8,则使用java.time.LocalDateTime(或其分区等效项),否则使用org.joda.LocalDateTime

java.util.Datejava.sql.Date是噩梦hellrides :)

+0

Upvoted为LocalDateTime'的'的建议或分区等同。如果你正在使用Java 6或7,有人说今天[java.time的后端](http://www.threeten.org/threetenbp/)是比Joda-Time更好的选择。 –

+0

Upvoted因为它把我放在正确的轨道上。尽管在应用程序代码中,人们只想引用java.util.Date,但在测试代码中这是不可能的。我需要使用'.equals'来比较从Hibernate返回的日期,'Timestamp.equals'对于'Date'的实例返回false,即使它们具有相同的毫秒值。除非我在这里失去了一些东西,那就是。 – ds390s

相关问题