比较hibernate映射的日期?

时间:2008-10-23 09:49:59

标签: java hibernate date

如何使用Hibernate将日期从java对象映射到数据库?我尝试了不同的方法,但我对它们并不满意。为什么?让我解释一下我的问题。我有以下类[1],包括我调用的主要方法,并使用以下映射[2]。当您查看控制台输出时,您可以看到有关此方法的问题。

  

错误

     

     

1

     

-1

     

1224754335648

     

1224754335000

     

Thu Oct 23 11:32:15 CEST 2008

     

时钟@ 67064

正如您所看到的那样,日期并不完全相同,尽管它们应该如此,因此很难比较它们而不用getTime的返回值。我还在映射中尝试了java.sql.Date,Timestamp和date而不是timestamp,但没有成功。

我想知道为什么最后三位数为零,如果这是一个休眠或java问题或我自己的愚蠢。

感谢您的阅读。

[1]

public class Clock {

    int id;
    java.util.Date date;

    public static void main(String[] args) {
        HibernateUtil.init();
        HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();

        Clock clock = new Clock();
        clock.date = new java.util.Date();

        HibernateUtil.getSessionFactory().getCurrentSession().saveOrUpdate(clock);
        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();

        HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();

        Clock fromDBClock = (Clock)HibernateUtil.getSessionFactory()
                        .getCurrentSession().get(Clock.class, 1);

        System.out.println(clock.date.equals(fromDBClock.date));
        System.out.println(fromDBClock.date.equals(clock.date));

        System.out.println(clock.date.compareTo(fromDBClock.date));
        System.out.println(fromDBClock.date.compareTo(clock.date));

        System.out.println(clock.date.getTime());
        System.out.println(fromDBClock.date.getTime());

        System.out.println(clock.date.toString());
        System.out.println(fromDBClock.toString());

        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();

        HibernateUtil.end();
    }

    public int getId() {
        return id;
    }

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

    public java.util.Date getDate() {
        return date;
    }

    public void setDate(java.util.Date date) {
        this.date = date;
    }


}

[2]

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="Clock" table="CLOCK">
        <id name="id" column="CLOCK_ID">
            <generator class="native"/>
        </id>
        <property name="date" type="timestamp"/>


    </class>

</hibernate-mapping>

4 个答案:

答案 0 :(得分:3)

MySql DateTime精度仅为秒。 Java日期精度为毫秒。 这就是为什么最后三位数字在放入数据库后为零。

执行原始日期:

date = date.setTime((date.getTime()/ 1000)* 1000);

这会将其设置为最后一秒,然后您的所有比较都将匹配。

(顺便说一句,   的System.out.println(fromDBClock.toString()); 应该   的System.out.println(fromDBClock.date.toString());

答案 1 :(得分:2)

SQL Server以3毫秒的精度存储datetime,这肯定会导致您看到的问题。一个结果是Java中的23:59:59.999最终成为SQL Server的第二天。我从未遇到过Oracle,Informix或MySQL的问题,但其他数据库的精度也可能较低。您可以使用Hibernate自定义类型来解决它。在写出日期值时,您必须舍入到比基础数据库精度更精确的东西。在Hibernate文档中搜索UserType,您将更改nullSafeSet方法以进行舍入。

答案 2 :(得分:1)

显然,目标RDBMS上的TIMESTAMP类型(您使用的是什么,顺便说一句?)不会存储毫秒数。尝试找到另一种本地类型,或将你的时间映射到其他东西上,例如long = ms-since-epoch。

答案 3 :(得分:0)

Personnaly,我使​​用名为DateUtils的Apache commons lang包类截断我在POJO对象中收到的每个日期。

参见[Apache commons site] [1]

[1]:http://commons.apache.org/lang/api/org/apache/commons/lang/time/DateUtils.html#truncate(java.util.Date,int)