如果调用两次,JPA 会打开两个会话吗?

Does JPA open two sessions if called twice?

我希望这对熟悉 JPA/Hibernate 的人来说是一个简单的答案。

因此,如果我在 Spring 中有一个扩展 JPA 接口的存储库接口,并且我连续调用它两次以获取数据库中的单个条目,它会打开两个 session秒?还是 session 对两者都开放?还是会第一次加载数据到内存,然后再使用?

我没有明确启用任何缓存,所以我猜它不会将它加载到内存中并使用它两次,但我对幕后的细节不是很熟悉。一切也都设置为延迟加载,所以不确定这是否会导致 sessions 快速关闭。

只是好奇,感谢您的回复!

So if I have a repository interface in Spring that extends the JPA interface, and I call it twice in a row to fetch a single entry in the DB, will it open two sessions? Or will the session stay open for both?

如果两个调用都是同一事务的一部分,则将只使用一个会话(绑定到当前事务上下文的会话)。

没有周围的事务,因为默认情况下存储库方法是事务性的,每个调用将在一个单独的事务中处理,这意味着两个单独的会话。

Or will it load the data into memory the first time, and then use it again?

如果您使用 findById(即 EntityManager.find())在同一事务中请求同一实体,第二次将从一级缓存提供服务。

如果您使用查询请求同一个实体,第二次将执行查询,但 Hibernate 将通过检索到的 id 意识到实体已经在缓存中找到,因此将从第一次提供结果级缓存也是如此。