微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我的问题是大多数情况下,使用与数据库中保存的日期相比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,以便准确了解正在发生的事情.
>打开休眠的‘show SQL’设置.这将导致Hibernate转储正在数据库上执行的原始sql.
>检查测试中的日志.它将有助于在类上实现toString并记录该值以与针对INSERT生成sql hibernate进行比较. sql语句中的值是否与Java时间戳字段的值匹配?

您应该检查数据库的DATETIME类型的精度设置.例如,在sql Server上,DATETIME实现了millisecond rounding(参见’准确性’字段),这有效地导致毫秒值的精度损失.您将需要更改列映射到的java类型或更改数据库中列的类型,具体取决于您的精度需求.

原文地址:https://www.jb51.cc/java/128556.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐