情况:如何强制Hibernate将日期返回为java.util.Date而不是Timestamp?
我有一个持久化类java.util.Date类型的变量:
import java.util.Date;
@Entity
@Table(name = "prd_period")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Period extends ManagedEntity implements Interval {
@Column(name = "startdate_", nullable = false)
private Date startDate;
}
对应表DB:
CREATE TABLE 'prd_period' (
'id_' bigint(20) NOT NULL AUTO_INCREMENT,
...
'startdate_' datetime NOT NULL
)
然后保存我的时期对象到DB:
Period p = new Period();
Date d = new Date();
p.setStartDate();
myDao.save(p);
之后,如果我试图从DB中提取我的对象,它将返回时间戳类型的变量startDate - 并且所有我尝试使用equals(...)的地方都返回false。
问题:是否有任何手段强迫Hibernate作为java.util.Date类型,而不是时间戳的对象返回日期没有每一个这样的变量的显式的修改(例如,它必须能够刚刚工作,没有明确修改java.util.Date类型的已有变量)?
注:
我找到了明确的解决方案,其中标注使用或setter被修改的数 - 但我有很多班级,日期变量 - 所以我需要一些集中式解决方案和所有下面描述的是不够好:
使用注释@Type: - java.sql.Date将返回
@Column @Type(type="date") private Date startDate;
使用注释@Temporal(TemporalType.DATE) - java.sql.Date将返回
@Temporal(TemporalType.DATE) @Column(name=”CREATION_DATE”) private Date startDate;
通过修改制定者(深层副本) - java.util.Date将被退回
public void setStartDate(Date startDate) { if (startDate != null) { this.startDate = new Date(startDate.getTime()); } else { this.startDate = null; } }
创作我自己的类型: - java.util.Date将返回
详细说明见这里: http://blogs.sourceallies.com/2012/02/hibernate-date-vs-timestamp/
我认为你应该使用刚刚显示的明确答案之一。主要用于未来的代码维护。它将允许新开发人员准确地看到你在做什么,而不是花费大量时间来弄清楚为什么系统中的日期与其他所有休眠系统的工作方式不同。 – Zoidberg 2012-03-02 13:23:41
第二种解决方案最适合我。另外,从你的blogpost看来,你依靠hibernate来创建你的数据库结构。如果你把它放在你的控制范围内,并且只是使用'date'而不是'timestamp'到处? – 2012-03-02 14:59:11
+1这确实是一个令人讨厌的问题。我现在与Hibernate一起工作了很多年,并且我不知道任何有关此的官方Hibernate文档。我正在使用*修改的setter *方法。我也在getter中做了一个深层拷贝,因为'java.util.Date'不是不可变的,所以无论如何深度拷贝应该是首选。 – tscho 2012-03-02 21:45:29