【问题标题】:Delete causes StaleStateException删除导致 StaleStateException
【发布时间】:2013-09-24 09:34:59
【问题描述】:

我们正在使用 Grails,它当然使用 hibernate 进行 O/R。在一个实例中,我们有多个请求试图删除同一个对象。第一个线程将删除,而尝试删除该对象的第二个线程将引发 StaleStateException。这正如预期的那样。根据文档:

http://docs.jboss.org/hibernate/envers/3.6/javadocs/org/hibernate/StaleStateException.html

这个例外:Also occurs if we try delete or update a row that does not exist.

现在,在我们的例子中它也不例外。我们不在乎它已经被删除。我们不想在删除之前进行检查,我们只想进行异常处理,因为它并不是真正的异常。

我们真正想做的是,如果尝试删除但对象不存在,则不会抛出此异常。

有没有办法用 Grails / Gorm 做到这一点?

我最好的理想是使用 HSQL 的一点 SQL 来进行删除,而不是使用 hibernate / grails API。

还有更好的吗?

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    尝试在线程中捕获异常:

    try {
        YourDomain.withTransaction { status ->
    
            ...
    
            yourDomainInstance.delete()
    
            ...
    
            }
    } catch (org.springframework.dao.OptimisticLockingFailureException olfe) {
    log.warn(olfe.toString())
    } catch (org.hibernate.StaleStateException staleStateException) {
    log.warn(staleStateException.toString())
    }
    

    【讨论】:

    • 我曾想过,但如果从不抛出异常,我会更喜欢。
    • 要完全删除异常,您可以将其从休眠源代码中远程并重新编译。堆栈跟踪准确地告诉您休眠在哪个文件和行中生成了异常。
    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多