Grails NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом - PullRequest
2 голосов
/ 05 марта 2019

Я новичок в 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

1 Ответ

0 голосов
/ 20 апреля 2019

попробуйте добавить на рабочее место

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