我什么时候可以看到hibernate实体的更新?

pinkon5k  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(257)

假设我正在使用spring和hibernate,在我的一个事务服务方法中执行如下操作。印刷品的预期结果是什么?更重要的是为什么?

// user1 perviously has some other name then x
User userInstance = userDAO.findById(1);
userInstance.setName("x");
System.out.println(userDAO.findById(1).getName());

userDAO.save(userInstance);
System.out.println(userDAO.findById(1).getName());

我是否总是希望看到我对查询的用户实体所做的更改?为什么?它究竟如何与hibernate代理和一级缓存交互?
谢谢你的真知灼见!

nbysray5

nbysray51#

在同一个会话中,hibernate将使用一级缓存来确保相同的实体(由相同的主键标识)总是由相同的对象示例表示。这意味着,在关闭会话之前,您是否与引用的实体交互 userInstance 或者你可以通过冬眠来完成 userDAO.findById(1) 您将始终引用完全相同的对象示例。
所以要回答你的问题,打印出来的结果是:x

ejk8hzay

ejk8hzay2#

我想第二行应该用 userInstance 而不是 userInstance1 . 我认为在执行第3行(如下)时,您将看到数据库的更新被刷新:

System.out.println(userDAO.findById(1).getName());

原因是内存中有一个未保存但已更新的版本,因此它被认为是“脏的”。当您重新读取同一对象(基于id)时,hibernate将首先将更新的对象刷新到数据库中,然后再重新读取它。

相关问题