hibernate - Grails NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联
问题描述
我是 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:具有相同标识符值的不同对象已与会话关联:[公司](它也可以是国家)
对我来说,这听起来像是 GORM 试图再次拯救国家和公司,并且由于交易尚未提交且之前的工作场所仍在会话中,休眠引发异常。有什么解决办法吗?我在这里做错了什么?有什么建议么 ?我正在使用 Grails 3.3.9
解决方案
尝试添加到 Workplace
static mapping = {
country cascade: 'refresh,evict'
company cascade: 'refresh,evict'
}
推荐阅读
- java - java.lang.NoSuchMethodError: javax/validation/Validator.forExecutables 错误 Hibernate 5 和 Validation API 1.1
- html5-canvas - 调试 JS 修改某些特定的画布元素
- android - Resources.getIdentifier 替代
- python - 如何更有效地遍历数据框并根据两列值更新一个字段?
- javascript - 如何在 Electron 中的父窗口和子窗口之间发送数据
- mysql - 连接 3 个表的 MySQL 查询给出错误的结果
- sql - 如何识别小数点后只有零的记录?
- r - 在 r 中的列表列中的所有列表中将 numeric(0) 替换为 NA
- android - 如何调整正在使用的图表百分比?
- css - 将横向和纵向图像放置在相同的高度