如何解决如果调用两次,JPA 是否会打开两个会话?
我希望这对熟悉 JPA/Hibernate 的人来说是一个简单的答案。
因此,如果我在 Spring 中有一个存储库接口来扩展 JPA 接口,并且我连续调用它两次以获取数据库中的单个条目,它会打开两个会话吗?或者会议将保持开放?还是会在第一次将数据加载到内存中,然后再次使用?
我没有明确启用任何缓存,所以我猜它不会将它加载到内存中并使用它两次,但我不太熟悉幕后的细节。一切都设置为延迟加载,因此不确定这是否会导致会话快速关闭。
只是好奇,感谢您的回复!
解决方法
因此,如果我在 Spring 中有一个存储库接口来扩展 JPA 接口,并且我连续调用它两次以获取数据库中的单个条目,它会打开两个会话吗?或者会议将保持开放?
如果两个调用都属于同一事务,则只会使用一个会话(与当前事务上下文相关的会话)。
没有周围的事务,因为存储库方法默认是事务性的,每次调用都将在单独的事务中处理,这意味着两个单独的会话。
还是会在第一次将数据加载到内存中,然后再次使用?
如果您使用 findById
(即 EntityManager.find()
)在同一个事务中请求同一个实体,则第二次会从第一级缓存提供。
如果你使用查询请求同一个实体,第二次查询将执行,但 Hibernate 会通过检索到的 id 意识到实体已经在缓存中找到,所以结果将从 1st-level 提供缓存也是如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。