Итак, во время массовой загрузки данных я строю массивное дерево объектов домена, проверяя внутреннюю согласованность, создавая ссылки между ними ... много обработки. Затем, сохраняя, я делаю допуск до сохранения через 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() ложна ...
У меня есть вручную пройти это смехотворное дерево и сбросить ссылки каждого дочернего объекта на обновленный «школьный» объект? Я чувствую, что, должно быть, я просто что-то пропустил или сделал что-то безумное.