从Hibernate保存到数据库的对象出错时间戳

时间:2012-08-09 08:57:16

标签: java spring hibernate datetime

我是Hibernate的新手,并且正在开发一个使用它的Web项目。

我有一个名为area的对象,它有一个日期对象(java.sql.Timestamp)属性modifiedDate。当我创建一个新对象时,modifieDate为null,并在我自己的类getHibernateTemplate().saveOrUpdate(area);中将其发送到org.springframework.orm.hibernate3.support.HibernateDaoSupport之后扩展datetime,它将使用当前时间戳设置并保存在数据库中。在数据库中,它保存为an org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

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

<timestamp name="modifiedDate" column="ModifiedDate"/>

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

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

如果需要映射使用getHibernateTemplate().refresh(area);,并且所有测试都在localhost上运行,一切都在同一台机器上运行。

我已经有了解决方法,在saveOrUpdate之后立即调用{{1}}我得到了正确的时间戳,但我仍然想知道是否有办法在saveOrUpdate中获取正确的modifiedDate。

1 个答案:

答案 0 :(得分:4)

我的理论:

正在发生的事情是,您在数据库端使用的数据类型不如Java端,因此在生成数据库期间,您持久保存到数据库的值会丢失精度(或以某种方式舍入,见下文)特定的SQL。以下是如何确定:

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

  2. 打开Hibernate的'show SQL'设置。这将导致Hibernate转储正在数据库上执行的原始SQL。

  3. 检查测试中的日志。它将有助于在您的类上实现toString并记录值以与{hmsnate为INSERT生成的值进行比较。 SQL语句中的值是否与Java时间戳字段的值匹配?

  4. 您应该检查数据库的DATETIME类型的精度设置。例如,在SQL Server上,DATETIME实现millisecond rounding(请参阅“准确性”字段),这有效地导致毫秒值的精度损失。您需要更改列映射到的Java类型,或者根据您的精度需求更改数据库中列的类型。