2013-08-09 1 views
0

Исключение я получаю при сохранении ребенка записи перед родителем одного: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

+0

grails позволяет сохранять дочерние объекты в родительском объекте с помощью динамических методов parent.addToChildren (child) ... смотрите здесь для получения дополнительной информации .. [gorm-gotchas] (http://blog.springsource.org/2010/07/02/gorm-gotchas-part-2 /) –

+0

Вы можете вставить свой журнал ошибок здесь? –

+0

Возможно, ваш сеанс покраснеть до родительского создания, без реального кода трудно сказать, где ошибка. –

ответ

0

Ваше исключение, вероятно, потому, что вы тестировали вокруг, не имея обнуляемый parent ограничения на вашем ребенок таблицу. Без обнуления будет 0 или что-то в ваших существующих записях и новых, потому что DB делает какую-то магию. GORM не удалит существующий FK, и он не добавит ограничение на nullable для существующих столбцов. Попробуйте вручную удалить ограничения или отбросить полный столбец. Двойная проверка для ограничения с нулевым значением в столбце parent_id.

Что касается вашей проблемы я бы продвинуть вас, чтобы добавить ребенка на родителей, а не спасти ребенка быть ребенком:

parent.addToChildren(child) 

Это также косвенно спасает ребенка, если он не был сохранен ранее.

Смежные вопросы