Grails NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

Posted

技术标签:

【中文标题】Grails NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联【英文标题】:Grails NonUniqueObjectException: A different object with the same identifier value was already associated with the session 【发布时间】:2019-07-27 02:39:11 【问题描述】:

我是 grails 的新手 - Gorm,因此我们将不胜感激。我有一个名为“Employee”的域对象,如下所示:

class Employee 

String firstName
String lastName
Set<Workplace> workplaces = new HashSet<>()
static hasMany = [workplaces: Workplace]

static mapping = 
    workplaces cascade: 'all-delete-orphan'


员工与名为“工作场所”的域具有一对多关系

class Workplace 

Employee employee
Country country
Company company
LocalDate startDate
LocalDate endDate
static belongsTo = [employee: Employee]

“国家/地区”和“公司”域是在 插件 中定义的域对象,我添加了一个依赖项。我在我的 Bootstrap.groovy 中填写公司和国家/地区的预定义值。这里是类:

class Company 

String cmpCode

static constraints = 
    cmpCode blank: false, maxSize: 255, unique: true



class Country 

String ctyCode
static constraints = 
    ctyCode blank: false, maxSize: 255, unique: true


Country(String ctyCode) 
    this.ctyCode = ctyCode




这就是我保存/更新员工的方式(在添加所有相关工作场所之后)

 @Transactional
Employee merge(Employee employee) 
    employee = employee.merge()//have tried with flush:true does not work 

    return employee

现在我的问题如下: 当我向我的员工添加不同的工作场所并尝试保存/合并 Employee 对象时,当且仅当我的工作场所中的公司和国家/地区代码是唯一的时,它才有效。如果我尝试添加具有相同国家、公司但开始/结束日期不同的工作场所,则会引发以下异常: org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[Company](也可以是 Country)

对我来说,听起来 GORM 试图再次拯救国家和公司,并且由于交易尚未提交且之前的工作场所仍在会话中,休眠引发异常。 有什么解决办法吗?我在这里做错了什么?有什么建议 ? 我正在使用 Grails 3.3.9

【问题讨论】:

您能否添加逻辑上您调用merge 服务的方式和位置?我认为这将为我们提供更多线索来帮助您。 【参考方案1】:

尝试添加到 Workplace

static mapping = 
     country cascade: 'refresh,evict'
     company cascade: 'refresh,evict'

【讨论】:

以上是关于Grails NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 grails 命令行编译 grails 项目?

是否可以在 Grails 之外使用 Grails 验证?如何?

Grails:企业级 Grails [关闭]

Grails - grails.converters.JSON - 删除类名

Grails - 在刷新 grails 错误之前保存瞬态实例?

Grails 3 - 资源插件