@RequestMapping("/testing")
@Transactional
public String testing(HttpServletRequest request, final ModelMap model)
{
Criteria criteria = session.getCurrentSession().createCriteria(Student.class);
criteria.setReadOnly(true);
criteria.add(Restrictions.eq("id", "ID12345"));
List<Student> result = criteria.list();
Student abc = result.get(0);
abc.setFirstname("AAA");
Criteria criteria2 = session.getCurrentSession().createCriteria(Student.class);
criteria2.setReadOnly(false);
criteria2.add(Restrictions.eq("id", "ID12345"));
result = criteria2.list();
Student abc2 = result.get(0);
abc2.setFirstname("BBB");
return "testing";
}
如上面的代码所示,setReadOnly
的{{1}}为true,因此criteria
不会是firstName
(在数据库中),但它已重置{{对于AAA
,1}}为false,为什么setReadOnly
没有成为criteria2
(在数据库中)?
答案 0 :(得分:0)
好的,经过一段时间的研究,我找到了原因。
当第一个查询加载对象时,hibernate将对象放在持久化上下文中并将对象标记为a b c
1 Text,text1 22-03-2015
1 Text11 23-03-2016
2 Text2 24-05-2015
3 Text5 29-05-2015
。这意味着对象最终不会被刷新。
在第二次加载对象的调用期间,hibernate在持久化上下文中获取对象,而不是再次调用数据库,因为获取基于主键。由于它是从持久化上下文加载的,因此它仍处于read-only
状态。
为了让对象再次恢复冲洗,我们可以使用read-only
来回退对象的setReadOnly(Object entity, boolean readOnly)
。