我使用Oracle 11g和JPA 2.0 (hibernate在JBoss 6.0.0)。我需要在实体中表示一个时间范围,所以我定义了这些字段:
@Temporal(TemporalType.TIME)
private Date startTime;
@Temporal(TemporalType.TIME)
private Date endTime;
生成的表使用两个DATE字段,这是可以的,因为Oracle没有只表示时间部分的类型。
当从数据库加载实体时,只加载时间部分(该字段包含java.sql.Time)。相反,如果我在字段中设置完整的日期+时间,那么日期部分将被持久化到数据库中。
是否有一种方法可以确保日期部分不会被持久化到数据库?
您可以编写setter方法来删除日期组件。简单的例子:
public void setStartTime(Date startTime)
{
this.startTime = new Time(startTime.getTime() % 86400000L);
}
尽管您最好使用Joda Time来进行日期/时间计算(参见此问题)。我没有测试以确保它是正确的,但它应该向您展示了基本的思想:
public void setStartTime(Date startTime)
{
this.startTime = new Time(LocalTime.fromDateFields(startTime).millisOfDay().get());
}