Исключение я получаю при сохранении ребенка записи перед родителем одного:Grails: «Целостность ограничение нарушено», когда ребенок рекорд был сохранен перед родителем один
GrailsWrappedRuntimeException: ORA-02291:
integrity constraint (GRB.FKF8F6B734389E9766) violated -
parent key not found
Код:
class Child {
Parent parent
static constraints = {
parent nullable: true
}
}
class Parent {
static hasMany = [ children: Child ]
}
def child = new Child()
child.save() // first save of Child
def parent = new Parent()
parent.save()
//session.flush() // the sudden flush
child.parent = parent
child.save()
// here is 'constraint violation' when transaction is committed
, как это указано в сообщении об исключении, Child
имеет родительский ключ Parent
установлен, но каким-то образом ключ не рассматривается как существующая строка по Hibernate в этот момент ...
Выше представлена упрощенная реконструкция событий, происходящих в моем коде. Обратите внимание, что эти действия выполняются в разных местах кода (предназначены для отделения друг от друга). К сожалению, такой миниатюрный код работает хорошо и не воспроизводит проблему ... Также я никогда не встречал такую проблему раньше - я использовал для сохранения дочерних записей перед родительскими и наоборот без каких-либо проблем.
Я мог бы исправить код двумя способами:
- комментирующих "первый сохранить" из
Child
(упорядочение экономит важно ?!) - или раскомментирован сеанс флеш
Хотя Я мог бы исправить это, я действительно не хочу зависеть от таких вещей, как порядок спасения или внезапного флеша ... Любая идея, как вылечить проблему, все еще имея надежный код?
Grails 2.2.0, Hibernate 3.6, Oracle XE
grails позволяет сохранять дочерние объекты в родительском объекте с помощью динамических методов parent.addToChildren (child) ... смотрите здесь для получения дополнительной информации .. [gorm-gotchas] (http://blog.springsource.org/2010/07/02/gorm-gotchas-part-2 /) –
Вы можете вставить свой журнал ошибок здесь? –
Возможно, ваш сеанс покраснеть до родительского создания, без реального кода трудно сказать, где ошибка. –