2013-10-05 1 views
0

Итак, во время массовой загрузки данных я строю массивное дерево объектов домена, проверяя внутреннюю согласованность, создавая ссылки между ними ... много обработки. Затем, сохраняя, я делаю допуск до сохранения через call session.clear() каждые 20 записей или около того.Grails "каскад" приложить() к сеансу?

Моя проблема заключается в том, что упомянутые объекты домена отделяются от сеанса, когда становится ясно, поэтому, когда я пытаюсь каскад сохранения, я получаю ожидаемую другой объект с тем же значением идентификатора уже связан с сессией

Фрагмент модели предметной области (параметры каскада не ясны ни в одном классе):

class School { 
    String name 
} 

class Room { 
    String roomNum 
    School school 
    static belongsTo = School 
    static hasMany = [teachers:Teacher] 
} 

class Teacher { 
    String name 
    Room room 
    School school 
    static belongsTo = Teacher 
    static hasMany = [students:Stuent] 
} 

class Student { 
    String name 
    Teacher teacher 
    School school 
    static belongsTo = Student 
} 

есть еще несколько слоев, и намного больше ширины для каждого слоя, каждый домен несет ссылку на «Школу «для удобства поиска. В службе все эти объекты построены со ссылкой на сохраненную школу.

def buildData() { 
School s = School.get(1) 
Room r = new Room(name: "A", school: s) 
Teacher t = new Teacher(room: r, school: s, name: "Smith") 
r.addToTeachers(t) 
Student s = new Student(teacher: t, school: s, name: "Billy") 
t.addToStudents(s) 

//ad nauseum 
} 

def persistData() { 
    //lots of processing 
    def session = sessionFactory.currentSession 
    session.flush() 
    session.clear() 
    ........ 
    r.save(failOnError:true) 
} 

r.save() терпит неудачу, не уникальный идентификатор 1, я могу проверить r.school.isAttached(), и это неверно. Так что я изменить его ...

... 
session.clear() 
r.school = School.get(r.school.id) 
log.info("Attached now? ${r.school.isAttached()}") //shows true 
r.save(failOnError:true) 
} 

r.save() терпит неудачу снова, и предсказуемо, r.teacher [0] .school.isAttached() ложна ...

У меня есть вручную пройти это смехотворное дерево и сбросить ссылки каждого дочернего объекта на обновленный «школьный» объект? Я чувствую, что, должно быть, я просто что-то пропустил или сделал что-то безумное.

ответ

1

Как обычно, я достаточно хорошо набираю его и смотрю в нужное место, и обычно я это выясняю.

Замена

r.school = School.get(r.school.id) 

с

r.school.attach() 

Исправлена ​​проблема путем повторного прикрепления ссылки в памяти, а не загрузки новой ссылки и установки экземпляра r.school к другому экземпляру , Подтверждено, что это происходит путем отладки и просмотра номеров объектов.

Я думал, что сделал это в прошлом и столкнулся с проблемами при подключении к сеансу, но я, должно быть, ошибся.

0

Прилагательные работы. получить это специальные, как это выглядит на месте первого, чтобы избежать попадания базы данных против нагрузки (см):

Hibernate: Difference between session.get and session.load

Кроме того, findById всегда работает.