【问题标题】:Losing Time When Saving to Database保存到数据库时浪费时间
【发布时间】:2012-12-10 22:45:21
【问题描述】:

我在 Web 服务器上使用 Java 和休眠来保存到 Oracle SQL 数据库。我创建了一个 Java Date 对象,但由于某种原因,当它进入数据库时​​,它只有日期而不是时间。例如,日期对象会说“2012 年 12 月 10 日下午 1:23:45”,但在数据库中它只说“10-DEC-12”

知道为什么会发生这种情况吗?下面是如何创建和保存日期的示例。

service.java

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

Nos nos = new Nos();
nos.setTimeReceived( new Date() );
session.save( nos );

tx.commit();

Nos.java

@Entity
@Table(name = "nos")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Nos
{
    @Id
    @GeneratedValue
    private Long id;

    @Basic(optional=false)
    @Temporal(TemporalType.DATE)
    @Column(name="timereceived")
    private java.util.Date timeReceived;

// getters and setters

【问题讨论】:

  • 这是记录在案的行为。 java.sql.Date 不包含时间(阅读 Javadocs)。您需要使用Timestamp
  • ...虽然这引出了一个问题,但在数据库中的类型是什么?如果它只是一个 date 类型,那么你在 Java 中做什么并不重要(了解 RDBMS 也可能很重要)。
  • 非常好的@Clockwork-Musem,我没想到。
  • 但是...我以为我读到 SQL DATE 确实包含时间?

标签: java sql hibernate


【解决方案1】:

使用TemporalType.TIMESTAMP,对应java.sql.Timestamp

根据the TemporalType JavaDocsTemporalType.DATE 映射到java.sql.Date,正如您所看到的那样,它没有时间组件:

为了符合 SQL DATE 的定义,java.sql.Date 实例包装的毫秒值必须通过在特定时区中将小时、分钟、秒和毫秒设置为零来进行“规范化”。实例已关联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2014-06-18
    • 2020-05-18
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多