Grails:events.PatchedDefaultFlushEventListener - 无法与会话org.hibernate.StaleObjectStateException同步数据库状态

时间:2014-08-21 14:22:45

标签: java hibernate spring-mvc grails groovy

我的应用中出现以下错误。

ERROR events.PatchedDefaultFlushEventListener  - Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [buddyis.User#848df2e62fcf93e1b3]
    at buddyis.SessionResource$_login_closure1.doCall(SessionResource.groovy:104)
    at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:814)
    at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:714)
    at buddyis.SessionResource.login(SessionResource.groovy:41)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
    at org.grails.jaxrs.web.JaxrsContext$JaxrsServiceImpl.process(JaxrsContext.java:193)
    at org.grails.jaxrs.JaxrsController.handle(JaxrsController.groovy:45)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at org.grails.jaxrs.web.JaxrsFilter.doFilterInternal(JaxrsFilter.java:46)
    at com.github.greengerong.PreRenderSEOFilter.doFilter(PreRenderSEOFilter.java:65)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

这个错误意味着什么,我该如何预防呢?

1 个答案:

答案 0 :(得分:3)

此异常由以下

引起
  • Ann读了一行
  • Bob读取同一行
  • Bob更新行
  • Ann试图更新该行,但尝试失败,因为Hibernate注意到自Ann读到它后它已被更新

很难告诉您该怎么做,因为您还没有提供任何背景信息,例如:阅读/更新行的人或者是什么。以下是一些一般性建议:

如果您不关心这种情况,并希望Ann能够更新该行,即使它已经更新(Bob),因为她阅读了它,只需通过添加以下内容来禁用乐观锁定相关的域类

static mapping = {
    version false
}

或者,您可以检查控制器是否自Ann读取后该行是否已更新,如果是,请向她显示更新的行,以便她可以将更新重新应用于最新数据。可以通过存储版本号来执行控制器中的检查。 (安读)在隐藏的表格字段中。提交Ann的更新时(隐藏版本号),从数据库加载对象并检查提交的版本号是否为。等于版本号。从数据库加载的对象。如果数字不同,请显示该行的最新版本以及通知她发生了什么的消息。

当然,上述建议仅适用于提交表单的用户正在更新行的情况。但正如我所说,你的问题并不包括任何背景,我的水晶球电池电量不足。