@Temporal没有按预期工作

时间:2017-10-27 10:41:01

标签: java hibernate

我使用@Temporal注释创建了一个实体:

import java.util.Date;
@Entity
public class TestEntity implements java.io.Serializable {
    private long id;
    private Date endDate;

    @Id
    @GeneratedValue(generator = "MY_SEQ", strategy = GenerationType.SEQUENCE)
    public long getId() {
        return id;
    }

    public void setId(final long id) {
        this.id = id;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "END_DATE", nullable = false)
    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(final Date endDate) {
        this.endDate = endDate;
    }

}

现在在我的代码中,我使用以下方法保存此实体:

Calendar calendar = GregorianCalendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 31);
calendar.set(Calendar.MONTH, Calendar.OCTOBER);
calendar.set(Calendar.YEAR, 2017);
Date date = calendar.getTime();

TestEntity testEntity = new TestEntity();
testEntity.setEndDate(date);

Session session = sessionFactory.getCurrentSession();
session.save(testEntity);

如果我在我的Tomcat服务器上运行此代码,它工作正常并将日期保存为10/31/2017

现在,如果我在weblogic服务器上运行相同的代码,上面的代码就像 - 10/31/2017 6:05:18 AM一样保存时间戳。在这里,我不想要时间戳,我只需要存储日期。

我已经启用日志来查看hibernate生成的SQL查询,我看不出是什么导致了这个问题。

在这种情况下,你能帮我解决一下这个问题吗?

我在两台服务器上使用相同的hibernate Jars,并从两台服务器指向Oracle数据库。

1 个答案:

答案 0 :(得分:2)

要将时间部分设为零,请设置所有字段:

Calendar calendar = GregorianCalendar.getInstance(); // Now
calendar.set(2017, Calendar.OCTOBER, 31, 0, 0, 0); // y M d H m s

或者更好,请致电calendar.clear();清除所有字段。

同样在数据库中,确保它不是DATETIME / TIMESTAMP,而是 DATE

顺便说一句:java.sql.Date(这里不是java.util.Date)将时间部分归零。

然后有新的java 8日期时间类,值得付出巨大的努力。