对象从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类型或更改数据库中列的类型,具体取决于您的精度需求。
上一篇: Object getting wrong time stamp from Hibernate saved to database
下一篇: tier application via dacpac fails after database restore