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