gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:33:18 25 4
gpt4 key购买 nike

    @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";
}

如上面的代码,它的 criteriasetReadOnly 为 true,因此 firstName 不会是 AAA (在数据库中),但它已将 criteria2setReadOnly 重置为 false,为什么 firstname 没有变成 BBB(在数据库中)?

最佳答案

好吧,经过一段时间的研究,我终于找到了原因。

当第一个查询加载对象时,hibernate 将该对象放入持久上下文中并将该对象标记为只读。这意味着该对象最终不会被刷新。

在第二次调用加载对象时,hibernate 在持久上下文中获取对象,而不是再次调用数据库,因为获取是基于主键的。由于它是从持久上下文加载的,因此它仍处于只读状态。

为了让对象再次恢复为可刷新状态,我们可以使用setReadOnly(ObjectEntity, boolean readOnly)来设置对象的readOnly

关于java - Hibernate Criteria setReadOnly 不适用于第二个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39217751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com