【问题标题】:@Temporal is not working as expected@Temporal 没有按预期工作
【发布时间】:2017-10-27 10:41:00
【问题描述】:

我已经使用@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 查询,但我看不出是什么导致了此问题。

您能帮我解决一下这种情况下的问题吗?

我在两台服务器中使用相同的休眠罐子,并从两台服务器指向 Oracle 数据库。

【问题讨论】:

  • Tomcat 服务器它工作正常,并将日期保存为 10/31/2017weblogic 服务器上面的代码正在保存时间戳以及 - 10/31 /2017 上午 6:05:18。那么这些都使用相同的数据库引擎和hibernate 版本?应该是 hibernate 生成列并决定这些列的数据类型。
  • @pirho,是的,我在两个服务器中使用相同的休眠 Jar 文件并使用相同的 Oracle 数据库。
  • 你如何调试这些东西? log.info(testEntity.getDate());?不检查 db 列?

标签: java hibernate


【解决方案1】:

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

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 日期时间类,值得付出巨大努力。

【讨论】:

  • 如果我使用 java.sql.Date 那么我得到这个异常Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property
  • 是的,java.sql.Date 已经失去了对休眠的用处。此外,新的 java 8 时间类需要当前的休眠或一些转换。也可以尝试 LocalDate 。但我猜是数据库列类型。
  • @user3181365 是 Oracle 12 吗?那就看this
  • @pirho 这是个大新闻
  • @JoopEggen 所以你的评论不是讽刺,而是问题所在?
猜你喜欢
  • 2021-10-19
  • 2020-03-18
  • 2012-06-14
  • 2014-11-15
  • 1970-01-01
  • 2012-07-02
  • 2011-09-07
  • 2013-03-03
  • 2015-05-18
相关资源
最近更新 更多