有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaGrails:事件。PatchedDefaultFlushEventListener无法将数据库状态与会话组织同步。冬眠StaleObjectStateException

我的应用程序中出现以下错误

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) 个答案

  1. # 1 楼答案

    此异常是由以下原因引起的

    • 安读了一行
    • 鲍勃读同一行
    • 鲍勃更新了这一行
    • Ann尝试更新该行,但尝试失败,因为Hibernate注意到自Ann读取该行后该行已被更新

    很难建议您对此做些什么,因为您没有提供任何上下文信息,例如谁或什么正在读取/更新行。以下是一些一般建议:

    如果您不关心这个场景,并且希望Ann能够更新该行,即使自她阅读该行以来它已经被更新(由Bob更新),只需通过向相关域类添加以下内容来禁用乐观锁定即可

    static mapping = {
        version false
    }
    

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

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