Я новичок в Grails - Gorm, поэтому буду признателен за любую помощь. У меня есть объект домена под названием «Сотрудник» следующим образом:
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
}
Теперь моя проблема заключается в следующем: Когда я добавляю разные рабочие места своему сотруднику и пытаюсь сохранить/объединить объект «Сотрудник», он работает тогда и только тогда, когда коды компании и страны на моих рабочих местах уникальны. Если я попытаюсь добавить рабочие места с той же страной, компанией, но с разными датами начала/окончания, возникнет следующее исключение: org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом: [Компания](Также может быть Страна)
Для меня это звучит так, как будто GORM снова пытается спасти страну и компании, и, поскольку транзакция еще не совершена, а предыдущее рабочее место все еще находится в сеансе, спящий режим выдает исключение. Есть ли какое-нибудь решение для этого? Что я здесь делаю неправильно? какие-либо предложения ? Я использую Grails 3.3.9





попробуй добавить в Workplace
static mapping = {
country cascade: 'refresh,evict'
company cascade: 'refresh,evict'
}
Можете ли вы добавить логику, как и где вы вызывали службу
merge? Я думаю, что это даст больше подсказок для нас, чтобы помочь вам много.