0

そのため、大量のデータをロードしている間、ドメイン オブジェクトの巨大なツリーを構築し、内部の一貫性をチェックし、それらの間の参照を作成しています。大量の処理が必要です。次に、保存中に、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 です...

このばかげたツリーを手動でたどって、更新された「学校」オブジェクトへのすべての子オブジェクトの参照をリセットする必要がありますか? 何かを見逃しているか、何かおかしなことをしているに違いないと感じています。

4

2 に答える 2

2

いつものように、私はそれを十分に叩き、適切な場所を見て、通常はそれを理解します。

交換する

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

r.school.attach()  

新しい参照をロードして r.school のインスタンスを別のインスタンスに設定するのではなく、インメモリ参照を再度アタッチすることで問題を修正しました。デバッグしてオブジェクト番号を調べることで、これが発生していることを確認しました。

私は過去にこれをやったと思っていて、セッションにアタッチするときに問題に遭遇しましたが、間違っていたに違いありません.

于 2013-10-07T13:12:42.823 に答える