我尝试了以下代码:
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 的数据库中获取记录。记录不存在。然后我尝试在对象上调用 setter,它抛出了一个异常。同意!!
由于记录不存在,我创建了一个新对象并调用saveOrUpdate()
. 所以现在我假设 ID#5 的对象在会话缓存中。
现在我再次尝试调用load()
ID#5 的方法并调用它的设置器。它再次抛出 ObjectNotFoundException。
问题 1
为什么它不能从 Session 缓存中选择记录?
当我创建新对象并尝试调用saveOrUpdate()
它时 NonUniqueObjectException
org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[com.cts.closr.Student#5]
它抛出了 ObjectNotFoundException,现在说“对象已与会话关联”。这不矛盾吗?
问题2
这是否意味着load()
方法永远不会检查会话上下文?它总是从数据库中获取?那么在这种情况下我必须使用get()
方法吗?