升级至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会话
以上方案均未解决问题
提问
- 是否需要更新特定配置或修改现有代码实现?
- 在
belongsTo关系下,调用save()是否存在特定的顺序要求?
内容的提问来源于stack exchange,提问作者AJ23
相关产品推荐
相关产品推荐

