You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至Grails 6.2.3后添加新用户触发DuplicateKeyException问题求助

Grails 5.2升级至6.2.3后新增用户触发DuplicateKeyException问题

异常堆栈信息

Caused by: org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session : [***.Person#101211]; nested exception is org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [**.**.**.Person#101211]
at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:230)
at org.grails.orm.hibernate.GrailsHibernateTemplate.convertHibernateAccessException(GrailsHibernateTemplate.java:717)
at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:301)
at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:241)
at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:120)
at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.performSave(AbstractHibernateGormInstanceApi.groovy:247)
at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:164)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:153)
at **.**.**.ProdUserService.$tt__createUser(ProdUserService.groovy:72)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
at **.**.**.UserController.save(UserController.groovy:158)

相关代码片段

Controller类

def save(){
def userData = new JsonSlurper().parseText(params.userData)

//business logic, some validations

//call to produserservice
CreateUserDTO createUserDTO = prodUserService.createUser(userData, user)

//business logic
}

Service类

CreateUserDTO createUser(Map params, ProdUser user) {

ProdUser userInst = new ProdUser()
grailsWebDataBinder.bind userInst, new SimpleMapDataBindingSource(params)


Person person = userInst.person

//business logic - assigning values to person like person.prop1 = userInst.prop1

person.save(failOnError: true) //异常触发位置
userInst.save(flush: true, failOnError: true)
new CreateUserDTO(prodUser: userInst, prodUserStatus: prodUserStatus)
}

关键背景信息

  • Person与ProdUser为域类,存在父子关系:Person belongsTo ProdUser
  • 此部分代码无任何变更,仅在将Grails版本从5.2升级至6.2.3后出现异常
  • 异常触发于person.save()调用时

已尝试方案

  • 使用merge()替代save()
  • 手动清理Hibernate会话
    以上方案均未解决问题

提问

  1. 是否需要更新特定配置或修改现有代码实现?
  2. 在belongsTo关系下,调用save()是否存在特定的顺序要求?

内容的提问来源于stack exchange,提问作者AJ23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:10:20