gpt4 book ai didi

hibernate - Grails 2 StaleObjectStateException

转载 作者:行者123 更新时间:2023-12-02 15:59:31 28 4
gpt4 key购买 nike

-更新:
事实证明,我们根本无法更新任何域对象。我们创建了非常简单的域/服务/ Controller 组合,但仍然出现StaleObjectStateException:行已由另一个事务更新或删除(或未保存值的映射不正确):[com.sra.cgms.test.TestDomain#1]
这是我们的 Realm 类(class)

class TestDomain {

static mapping = {
table name:'TEST_DOMAIN', schema:'cgms'
id generator:'identity', column:'id', sqlType: 'int'
}

String someVal

static constraints = {

someVal(nullable: true)
}
}

这是我们的服务类别:
class TestService {

public void updateDomain(int domainId) {
TestDomain testDomain = TestDomain.get(1)
testDomain.someVal = "updated Val"
testDomain.save(flush: true, failOnError: true)
}
}

这是我们的 Controller :
class TestController {

def testService


def updateData() {

testService.updateDomain(1);

render "Data updated"
}
}

另外,当我们尝试从Grails控制台调用testService.updateDomain(1)时,它没有问题。

-结束更新

希望Groovy / Grails项目中的某人在以下情况之前遇到此(奇怪)行为:

我们正在尝试将当前的Grails 1.3.7版本升级到Grails 2.4.5,并在一些地方获取StaleObjectStateException(提交表单时)

消息通常看起来像:

类别为[com.sra.cgms.workflow.WorkflowTaskHistory]的对象,标识符为[212430]:乐观锁定失败;嵌套的异常是org.hibernate.StaleObjectStateException:行已由另一个事务更新或删除(或未保存的值映射不正确):[com.package.workflow.WorkflowTaskHistory#212430]

我们的环境配置是:
  • Groovy 2.3,Grails 2.4.5,Hibernate 4.3.8.1(也尝试过3.6.10.18),SQL Server 2008,JTDS JDBC Driver 1.2.5(也尝试过1.3.1)

  • 我们浏览了整个网络,通常在多用户环境中人们会遇到此异常。但是,当我们以单个用户的身份进行本地测试时,会发生这种情况。我们尝试了很多建议:
  • 关闭休眠乐观锁定(禁用GORM域实体中的版本)
  • 在保存到数据库之前锁定对象。

  • 以上均无济于事。这是DataSource.groovy中的一个片段:
        hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    //cache.region.factory_class = 'org.hibernate.cache.SingletonEhCacheRegionFactory' // Hibernate 3
    cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory' // Hibernate 4
    singleSession = true // configure OSIV singleSession mode
    flush.mode = 'manual' // OSIV session flush mode outside of transactional context
    }

    // environment specific settings
    environments {
    local {
    dataSource {
    dbCreate = "update" // one of 'create', 'create-drop','update'
    url = "jdbc:jtds:sqlserver://localhost/test_local"
    username="dbuser"
    password="secret"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    logSql = true
    properties {
    maxActive = 100
    maxIdle = 25
    minIdle = 5
    initialSize = 5
    testOnBorrow = true
    validationInterval = 30*1000 //30 seconds
    validationQuery = "SELECT 1"
    //defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
    }
    }
    }
    }

    最佳答案

    事实证明,此StaleObjectStateException问题的来源与配置或代码无关。

    在应用程序启动时,我们在BootStrap.groovy代码中运行了几个SQL脚本来初始化数据库(MS SQL Server)。其中一些SQL脚本包含以下内容

    SET NOCOUNT ON;

    我们认为该行会导致SQL Server始终为更新语句返回0(也可能是其他类型的SQL语句)。当Hibernate执行update语句并检查返回值时,它总是找到0。Hibernate将该值与期望值进行比较(domain.save()调用为1)。期望值和返回值不匹配,因此Hibernate认为数据过时,因此引发StaleObjectStateException。请注意,Hibernate会检查您是否打开版本。

    希望此信息可以帮助那些情况类似的人

    关于hibernate - Grails 2 StaleObjectStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386272/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com