そのため、大量のデータをロードしている間、ドメイン オブジェクトの巨大なツリーを構築し、内部の一貫性をチェックし、それらの間の参照を作成しています。大量の処理が必要です。次に、保存中に、20 レコードごとに session.clear() を呼び出して保存をバッチ処理しています。
私の問題は、参照されたドメインオブジェクトがクリア時にセッションから切り離されることです。そのため、保存をカスケードしようとすると、同じ識別子値を持つ別のオブジェクトがセッションに既に関連付けられていると予想されます
ドメイン モデルのフラグメント (カスケード設定はどのクラスでも明示的ではありません):
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() が失敗し、一意でない ID が 1 です。r.school.isAttached() を確認できますが、それは false です。だから私はそれを...
...
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() は false です...
このばかげたツリーを手動でたどって、更新された「学校」オブジェクトへのすべての子オブジェクトの参照をリセットする必要がありますか? 何かを見逃しているか、何かおかしなことをしているに違いないと感じています。