0
    @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为 true criteria,所以firstName不会AAA(在数据库中),但它已将 重置setReadOnly为 false criteria2,为什么firstname没有变成BBB(在数据库中)?

4

1 回答 1

1

好的,经过一段时间的研究,我设法找出了原因。

当第一个查询加载对象时,hibernate 将对象置于持久上下文中并将对象标记为read-only. 意味着对象最终不会被刷新。

在第二次调用加载对象期间,休眠在持久上下文中获取对象,而不是再次调用数据库,因为获取是基于主键的。由于它是从持久上下文加载的,因此它仍处于read-only状态。

为了让对象再次恢复到flush-able,我们可以使用对象setReadOnly(Object entity, boolean readOnly)的set back readOnly

于 2016-10-03T01:17:41.623 回答