Spring Boot& Spring Data:Hibernate Sessions是如何管理的?

时间:2014-09-07 12:05:44

标签: hibernate session jpa spring-data spring-boot

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

我喜欢Hiberante的一个方面是它的缓存功能 - 当你提交与特定对象匹配的多个查询时,你将在每次执行查询时返回该对象的相同实例(关于Java' s ==运营商)。但是,在使用Spring Data和JpaRepository类时,情况似乎并非总是如此。出于这个原因,我假设这里有多个HibernateSession个实例。

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

谢谢,

艾伦

1 个答案:

答案 0 :(得分:46)

我想我自己找到了答案。如果有人发现了这个问题,请点击这里。

Spring如何管理Hibernate会话?

默认情况下,Spring Boot在存储库级别应用事务管理。在这种情况下,当调用JpaRepository方法(或通常任何Repository方法)时,Spring将:

  • 要求SessionFactory创建新会话
  • 打开此会话
  • 开启交易
  • 执行调用的Repository方法
  • 关闭交易
  • 关闭会话

但是,如果将@Transactional应用于服务类或方法,则Spring将在进入服务方法时打开会话和事务,并且将在现有事务中执行存储库方法。

有什么后果?

作为程序员......

  • 您根本不需要关心交易或会话。
  • 如果您想依赖Hibernate的缓存功能,则必须在比存储库更大的范围上指定@Transactional。缓存仅适用于同一HibernateSession
  • 您必须根据Hibernate ID值确定@Entity个对象的等效性,而不是使用Java的==运算符。
  • 您需要注意@OneToMany类(请参阅@Entity而不是FetchMode.LAZY)中的惰性集合(例如在FetchMode.EAGER引用中)是专门使用的在@Transactional - 注释方法

另外,作为参考,以下链接非常有用:Multiple Transactions in single session

与Spring的许多其他方面一样,如果您愿意牺牲对应用程序的直接控制权,那么在这里可以获得很多东西。