Ble*_*lem 7 java spring datetime hibernate
我是Hibernate的新手,并且正在开发一个使用它的Web项目.
我有一个名为area的对象,它有一个date object(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)
Run Code Online (Sandbox Code Playgroud)
从后续数据库获取对象时,正确的日期没有问题,只有在创建时它才会获得错误的值.
有没有办法在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 hibernate 为INSERT
. SQL语句中的值与Java时间戳字段的值匹配吗?
您应该检查数据库DATETIME
类型的精度设置。例如,在 SQL Server 上,DATETIME
实现毫秒舍入(请参阅“精度”字段),这实际上会导致毫秒值的精度损失。您将需要更改列映射到的 Java 类型或更改数据库中列的类型,具体取决于您的精度需求。
归档时间: |
|
查看次数: |
2318 次 |
最近记录: |