gpt4 book ai didi

java - Hibernate一级缓存的使用

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:39 26 4
gpt4 key购买 nike

看起来很简单的问题。我尝试了很多理解但失败了。

据我所知,Hibernate 一级缓存意味着 session 级缓存。当我们在同一 session 中多次检索同一对象时,它将从缓存中检索。

例如,我在数据库中有一个 ID 为 100 的员工记录。

我打开一个 session 并获取该员工对象。在我关闭 session 之前,该对象在同一 session 中可用。

问题:为什么我需要在同一个 session 中多次检索同一个对象(在我关闭它之前它在 session 中是如何可用的)?

最佳答案

As per my knowledge Hibernate first level cache means session level cache.When we retrieve the same object more than once in same session it will retrieve from Cache.

只对了一半。除了你所说的,一级缓存的一个主要原因是,在同一 session 下,Hibernate 将确保相同的实体(具有相同 ID 的实体)将由相同的对象实例表示。

只有当您通过 ID 从 session 中获取实体时,您所说的才是正确的:

Foo foo1 = session.get(Foo.class, 1L);
Foo foo2 = session.get(Foo.class, 1L);

get() 的第一次调用将转到 DB 以加载 Foo。当调用第二次调用时,Hibernate 将检查在此 session 中是否已检索到 ID 为 1 的任何 Foo。由于它之前已被检索,Hibernate 将简单地获取该 Foo 实例并返回给您。

但是,这种情况并不是最常见的情况,您会看到一级缓存生效。考虑一下:

// psuedo code only
User user = findByUserName("ADRIAN"); // assume ID = 777
List<User> users = findAllActiveUsers();

(假设上述查找器通过 Hibernate session 在内部运行查询)当 Hibernate 运行第二个查询时,Hibernate 在内部运行 SQL,获取结果集,并将每条记录转换为用户。假设其中一个 Activity 用户的 ID 为 777。当 Hibernate 构造该用户对象实例时,它将首先检查它是否存在于一级缓存中。因为它是以前检索过的(在以前的查询中,通过用户名查找),而不是构造一个新的 User 对象实例,Hibernate 将简单地重用先前构造的实例(并存储在一级缓存中)并在结果列表中使用它。

通过这样做,Hibernate 可以确保在同一个 session 中,如果您通过不同的方式检索相同的实体(具有相同 ID 的相同类),您始终可以假设该实体将是相同的对象实例。

想想一个更复杂的例子,你正试图从你的系统中检索 Order,它指的是 User(假设多对一)。你会发现,不同的Order,只要它引用同一个User(在数据库中),它实际上指的是同一个User对象实例.


对于

的问题

how it is available in session until I close it

它更多的是Hibernate的内部实现细节。不过从概念上,你可以想象成,每个Session内部都有一个Map,key是Entity Type+ID,value是实体对象实例。

当您从数据库中查询并且 session 为您构建实体时,对于每个实体,如果它已经存在,它将从映射中查找。如果没有, session 将构建实体并放入 map 中。如果它已经存在, session 将简单地使用 map 中的实体

通过 ID 获取实体时的类似想法(通过 Session.get()Session.load() 等)

关于java - Hibernate一级缓存的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39482861/

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