[英]Grails “cascade” attach() to session?
因此,在批量數據加載期間,我正在構建一棵巨大的域對象樹,檢查內部一致性,在它們之間創建引用...進行大量處理。 然后在保存時,我每隔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()為假...
我是否必須手動走這棵可笑的樹,並將每個子對象的引用重設為刷新的“學校”對象? 我覺得我一定只是想念一些東西或做一些瘋狂的錯誤。
像往常一樣,我在上面敲打夠了,然后看向正確的位置,通常我會弄清楚。
更換
r.school = School.get(r.school.id)
與
r.school.attach()
通過重新附加內存中引用而不是加載新引用並將r.school實例設置為其他實例來解決此問題。 通過調試並查看對象編號確認發生了這種情況。
我以為我過去曾經這樣做過,並且在參加會議時遇到了問題,但我一定是誤會了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.