Hibernate Criteria setReadOnly不适用于第二个查询

时间:2016-08-30 02:07:33

标签: java hibernate transactions criteria hibernate-session

    @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(在数据库中)?

1 个答案:

答案 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)