对于那些熟悉jpa/hibernate的人,我希望这是一个简单的答案。因此,如果我在spring中有一个扩展jpa接口的repository接口,并且我连续调用它两次以获取db中的单个条目,它会打开两个会话吗?或者会议对双方都开放?还是第一次将数据加载到内存中,然后再次使用?我还没有明确启用任何缓存,所以我猜它不会加载到内存中并使用它两次,但我不太熟悉幕后的细节。所有内容都设置为延迟加载,因此不确定这是否会导致会话快速关闭。只是好奇,谢谢你的回答!
wvyml7n51#
因此,如果我在spring中有一个扩展jpa接口的repository接口,并且我连续调用它两次以获取db中的单个条目,它会打开两个会话吗?或者会议对双方都开放?如果两个调用都是同一事务的一部分,则只使用一个会话(与当前事务上下文关联的会话)。在没有周围事务的情况下,由于存储库方法在默认情况下是事务性的,因此每个调用都将在一个单独的事务中处理,这意味着两个单独的会话。还是第一次将数据加载到内存中,然后再次使用?如果您在同一事务中使用 findById (即。 EntityManager.find() ,第二次将从一级缓存提供服务。如果您使用查询请求同一个实体,那么第二次查询将执行,但是hibernate将实现该实体,因为检索到的id已经在缓存中找到,因此结果也将从一级缓存中提供。
findById
EntityManager.find()
1条答案
按热度按时间wvyml7n51#
因此,如果我在spring中有一个扩展jpa接口的repository接口,并且我连续调用它两次以获取db中的单个条目,它会打开两个会话吗?或者会议对双方都开放?
如果两个调用都是同一事务的一部分,则只使用一个会话(与当前事务上下文关联的会话)。
在没有周围事务的情况下,由于存储库方法在默认情况下是事务性的,因此每个调用都将在一个单独的事务中处理,这意味着两个单独的会话。
还是第一次将数据加载到内存中,然后再次使用?
如果您在同一事务中使用
findById
(即。EntityManager.find()
,第二次将从一级缓存提供服务。如果您使用查询请求同一个实体,那么第二次查询将执行,但是hibernate将实现该实体,因为检索到的id已经在缓存中找到,因此结果也将从一级缓存中提供。