hibernate - Grails NonUniqueObjectException:具有相同标识符值的另一个对象已与 session 关联

标签 hibernate grails gorm grails-domain-class

我是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:具有相同标识符值的另一个对象已与 session 关联:[公司] (也可以是Country)

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

最佳答案

尝试添加到Workplace

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

关于hibernate - Grails NonUniqueObjectException:具有相同标识符值的另一个对象已与 session 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55006028/

相关文章:

java - 实体管理器最佳实践

jquery - jQuery fullcalendar:IE中的事件(作为json feed)和事件(作为函数)问题

parsing - 如何解析Groovy代码?

grails - 保存后显示Grails表单可防止历史记录后退按钮显示

grails - 如何在Grails中添加jdbc驱动程序以访问Ingres数据库

java - 在 spring-mvc 中使用抽象工厂模式时出现空指针异常

java - SpringMVC、c3p0、hibernate、JPA 应用程序泄漏连接导致 Too Many Connections 错误

java - hibernate generate_statistics 将纳秒更改为秒

grails - 从Grails项目中删除数据库迁移插件

hibernate - Grails Domain Binder.getMapping(Domain)对于Grails-3.2.4中的非持久性域返回null