当前位置: 首页 > 知识库问答 >
问题:

Spring Boot和Spring Data:如何管理Hibernate会话?

吕皓
2023-03-14

我目前正在开发一个使用Spring Boot和Spring Data(准确地说是其jparepository接口)以及Hibernate的应用程序。

我喜欢Hiberante的一个特性是它的缓存特性--当您提交多个与特定对象匹配的查询时,您将在每次执行查询时返回该对象的相同实例(相对于Java的==运算符)。但是,在使用Spring数据jparepository类时,情况似乎并不总是这样。因此,我假设这里有多个hibernateSession实例在工作。

因此,我的问题是:Spring Data如何处理Hibernate会话?它什么时候打开或关闭它们?有没有办法将其配置为在我的应用程序的整个运行时使用相同的会话,以充分利用Hibernate的对象缓存?有理由不那样做吗?

谢谢,

阿兰

共有1个答案

史淇
2023-03-14

我想我自己已经找到答案了。如果有人找到这个问题,我的答案是。

Spring如何管理Hibernate会话?

默认情况下,Spring Boot在存储库级别应用事务管理。在这种情况下,当调用jparepository方法(或者一般情况下任何repository方法)时,Spring将:

    null

后果是什么?

作为一个程序员...

  • 您根本不需要关心事务或会话。
  • 如果希望依赖Hibernate的缓存功能,则必须在比存储库更大的范围上指定@transactional。缓存仅在相同的hibernateSession中工作。
  • 您必须通过@entity对象的Hibernate ID值来确定它们的等价性,而不是使用Java的==运算符。
  • 您需要注意,您的@entity类(请参阅fetchmode.lazy而不是fetchmode.eage)中的惰性集合(例如@onetomany引用中的惰性集合)只在@transaction-注释的方法
  • 中使用

下面的链接也很有帮助,以供参考:单个会话中的多个事务

与Spring的许多其他方面一样,如果您愿意牺牲对应用程序的直接控制,那么这里将会有很多收获。

 类似资料:
  • 所以我有一个三层应用程序。通过spring boot starter jpa自动配置hibernate。以及使用@EnableJpaRepositories(enttityManagerFactory、transactionManager、basepackages)的配置类 我的问题是,如果控制器调用从数据库获取实体的服务,那么该服务是否可以将该实体传递给其他组件,而不会分离,考虑到它仍然是同一个

  • 问题内容: 我对cookie如何与Scrapy一起使用以及如何管理这些cookie感到有些困惑。 网站的运作方式: 当你访问网站时,你将获得一个会话cookie。 当你进行搜索时,该网站会记住你搜索的内容,因此当你执行诸如转到下一页结果之类的操作时,该网站就会知道它正在处理的搜索。 我的剧本: 我的spider的起始网址为 搜索页面由请求,搜索表单响应被传递到 然后使用和搜索表单响应进行很多搜索请

  • 我知道使用spring boot,您不需要打开和关闭Hibernate会话。 而是为了理解它是如何在内部工作的,它在哪一层打开Hibernate会话,以及何时关闭Hibernate会话。 我创建了一个PoC。我有一个spring boot应用程序,它有两个实体,一个是,另一个是,和之间有一对多的关系。 我有一个两个API,一个是添加记录,另一个是获取所有记录。这些API存在于CustomerEnd

  • 问题内容: 我正在构建一个系统,其中来自客户端的每个请求都会在服务器端生成多个线程。然后,每个线程都使用一个或多个DAO(某些DAO可以同时被多个线程使用)。Spring 将所有DAO注入()到我的线程类中。每个DAO也接受注射。 什么是在这些多个DAO之间管理Hibernate会话的正确方法,这样我就不会因多线程环境而遇到问题(例如,来自不同线程的几个DAO试图同时使用同一会话)? 我在Hibe

  • 当我只保留一个主键--无论是CFO_ID还是LAST_UPDATE_DTS,并完全删除Idclass时,它工作得非常好。这让我认为idclass有问题,但我找不到任何问题。有人能帮忙吗?

  • 下面是我的实体类的一个片段 当使用(Spring Boot Hibernate)Spring Boot-setups模式时,会自动包含如下序列 但是我使用Flyway 5.0.7来设置我的模式。在这种情况下,我收到下面的错误,这意味着没有创建序列。 我能够通过使用如下所示的飞行脚本创建序列来解决此问题 但是现在这个序列被用来为我不想要的所有实体生成ID。我希望每个实体都有自己独立的序列。 在使用F