Hibernate一级缓存和get方法

时间:2017-01-06 13:28:05

标签: java hibernate caching

我已经读过session.get(Employee.class, new Long(1))方法将从缓存或数据库中获取数据。

如果有两个用户同时访问该应用程序。

如果用户 - > User1正在执行get,然后将从DB检索数据。现在数据被移动到缓存 如果用户 - > User2已删除记录或更新记录。然后
如果用户 - > User1正在执行get,然后将从缓存中检索数据。

Isnt User1正在获取旧数据。它是否属于缓存的陷阱。 或者我在这里遗漏了什么?

我可以说这就是为什么User1在同一个会话中进行了2次session.get。但我仍然需要不同的意见。

3 个答案:

答案 0 :(得分:0)

您理解正确:缓存绑定到会话,如果将对象加载到第一级缓存,则不会使用#get()执行SQL。您可以使用#evict()从缓存中清除一个对象,或#clear()清除缓存中的每个对象,而无需关闭会话。关闭会话将始终删除整个缓存。

查看一个很好的解释here

答案 1 :(得分:0)

您需要详细了解容器管理的实体管理器

  

Java EE中最常用且最广泛使用的实体管理器   environment是容器管理的实体管理器。在这种模式下,   容器负责实体的开启和关闭   经理(这对应用程序是透明的)。也是   负责交易边界。容器管理的实体   经理通过依赖注入或在应用程序中获得   通过JNDI查找,容器管理的实体管理器需要   使用JTA交易。

您想要了解和存档的内容以及如何使用它是可以应对的。 更多doucmentation Entity Mananger

答案 2 :(得分:0)

不,因为Hibernate会在缓存中保存数据,但无论您是使用Hibernate更新数据,它都会知道存在一些更改。如果使用SQL更新数据,或者Hibernate无法看到发生的事情,那么您将遇到麻烦。