对象从Hibernate中获取错误的时间戳记保存到数据库

我是Hibernate的新手,并且在使用它的Web项目上工作。

我有一个名为area的对象,它具有一个日期对象( java.sql.Timestamp )属性modifiedDate。 当我创建一个新对象时,modifieDate为null,并在发送给getHibernateTemplate().saveOrUpdate(area); 在我自己的类中,它扩展了org.springframework.orm.hibernate3.support.HibernateDaoSupport它使用当前时间戳设置并保存在数据库中。 在数据库中它被保存为datetime

我的问题是大多数情况下,对象的更新日期与数据库中保存的日期相比为1毫秒,因此如果在不重新加载页面的情况下尝试更新任何内容,则会导致此异常:

an org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

从数据库中获取对象后的正确日期没有问题,只有在创建时才会得到错误的值。

有没有办法在SaveOrUpdate上获取正确的modifiedDate?

如果需要,映射使用<timestamp name="modifiedDate" column="ModifiedDate"/>并且所有测试都在localhost上运行,并且所有测试都在同一台机器上运行。

我已经有了一个解决方法,通过调用getHibernateTemplate().refresh(area); 在saveOrUpdate后面,我得到正确的时间戳,但我仍然想知道是否有方法在saveOrUpdate上获取正确的modifiedDate。


我的理论:

发生的情况是,您在数据库端使用的数据类型不如Java端,因此在生成特定于数据库的SQL期间,存储在数据库中的值正在丢失精度(或以某种方式舍弃,请参见下文) 。 以下是如何确定:

  • 请记住,Hibernate通过生成在您的数据库中执行的SQL语句来工作。 为了诊断像这样的Hibernate映射问题,您需要查看正在执行的SQL,以便准确知道发生了什么。

  • 打开Hibernate的'显示SQL'设置。 这将导致Hibernate转储在数据库上执行的原始SQL。

  • 检查测试中的日志。 这将有助于在你的类上实现toString ,并记录该值以与SQL休眠为INSERT生成的值进行比较。 SQL语句中的值是否与Java时间戳字段的值匹配?

  • 您应该检查数据库的DATETIME类型的精度设置。 例如,在SQL Server上, DATETIME实现毫秒舍入(请参见'精度'字段),该值有效导致毫秒值的精度损失。 您将需要更改列的映射到的Java类型或更改数据库中列的类型,具体取决于您的精度需求。

    链接地址: http://www.djcxy.com/p/62335.html

    上一篇: Object getting wrong time stamp from Hibernate saved to database

    下一篇: tier application via dacpac fails after database restore