簡體   English   中英

Grails會“級聯”到會話的attach()嗎?

[英]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實例設置為其他實例來解決此問題。 通過調試並查看對象編號確認發生了這種情況。

我以為我過去曾經這樣做過,並且在參加會議時遇到了問題,但我一定是誤會了。

附加作品。 get是特殊的,因為它首先在本地查找,以避免數據庫命中vs負載(見下文):

休眠:session.get和session.load之間的區別

此外,findById始終有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM