@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,它的criteria为true,因此firstName不会是AAA(在数据库中),但是对于setReadOnly,它已将criteria2重置为false,为什么没有成为firstname(在数据库中)? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 好的,经过一段时间的研究,我设法找到了原因。在第一个查询加载对象时,休眠将对象置于持久上下文中并将该对象标记为read-only。这意味着该对象最终将不会被冲洗。在第二次调用以加载对象期间,休眠将在持久上下文中获取对象,而不是再次调用数据库,因为获取是基于主键的。由于它是从持久性上下文中加载的,因此它将仍处于read-only状态。为了使对象再次可刷新,我们可以使用setReadOnly(Object entity, boolean readOnly)设置对象的readOnly。 (adsbygoogle = window.adsbygoogle || []).push({}); 10-04 20:26