我是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。
答案 0 :(得分:4)
我的理论:
正在发生的事情是,您在数据库端使用的数据类型不如Java端,因此在生成数据库期间,您持久保存到数据库的值会丢失精度(或以某种方式舍入,见下文)特定的SQL。以下是如何确定:
请记住,Hibernate通过生成在数据库中执行的SQL语句来工作。为了诊断这样的Hibernate映射问题,您需要查看正在执行的SQL,以便准确了解正在发生的事情。
打开Hibernate的'show SQL'设置。这将导致Hibernate转储正在数据库上执行的原始SQL。
检查测试中的日志。它将有助于在您的类上实现toString
并记录值以与{hmsnate为INSERT
生成的值进行比较。 SQL语句中的值是否与Java时间戳字段的值匹配?
您应该检查数据库的DATETIME
类型的精度设置。例如,在SQL Server上,DATETIME
实现millisecond rounding(请参阅“准确性”字段),这有效地导致毫秒值的精度损失。您需要更改列映射到的Java类型,或者根据您的精度需求更改数据库中列的类型。