以下のコードを試しました:
Student s1 = (Student) s.load(Student.class, 5); // this records not there in DB
try {
s1.setName("Kaushik1");
} catch (ObjectNotFoundException e) {
s1 = new Student();
s1.setId(5);
s1.setName("trying1");
}
s.saveOrUpdate(s1);
Student s2 = (Student) s.load(Student.class, 5);
try {
s2.setName("Kaushik2");
} catch (ObjectNotFoundException e) {
//Why should it throw ObjectNotFoundException now
s2 = new Student();
s2.setId(5);
s2.setName("trying2");
}
s.saveOrUpdate(s2); //Why it throws NonUniqueObjectException
以前load
は ID#5 で DB からレコードを取得していました。レコードが存在しません。次に、オブジェクトでセッターを呼び出してみましたが、例外がスローされました。同意!!
レコードが存在しなかったので、新しいオブジェクトを作成して呼び出しsaveOrUpdate()
ました。したがって、ID#5 のオブジェクトがセッション キャッシュにあると仮定します。
load()
ここで、ID#5 のメソッドを再度呼び出し、そのセッターを呼び出します。再度 ObjectNotFoundException をスローします。
質問1
セッションキャッシュからレコードを選択できないのはなぜですか?
新しいオブジェクトを作成して呼び出そうとするとsaveOrUpdate()
、 NonUniqueObjectException
org.hibernate.NonUniqueObjectException: 同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられていました: [com.cts.closr.Student#5]
ObjectNotFoundException がスローされ、「オブジェクトは既にセッションに関連付けられています」と表示されるようになりました。それは矛盾していませんか?
質問2
load()
メソッドがセッションコンテキストをチェックしないということですか?常にDBからフェッチしますか? そのような場合、get()
メソッドを使用する必要がありますか?