我目前正在开发一个使用Spring Boot和Spring Data(其JpaRepository
接口准确)的应用程序以及Hibernate。
我喜欢Hiberante的一个方面是它的缓存功能 - 当你提交与特定对象匹配的多个查询时,你将在每次执行查询时返回该对象的相同实例(关于Java' s ==运营商)。但是,在使用Spring Data和JpaRepository
类时,情况似乎并非总是如此。出于这个原因,我假设这里有多个HibernateSession
个实例。
因此我的问题是:Spring Data如何处理Hibernate会话?什么时候打开或关闭它们?有没有办法将它配置为对我的应用程序的整个运行时使用相同的会话来充分利用Hibernate的对象缓存?有没有理由不这样做?
谢谢,
艾伦
答案 0 :(得分:46)
我想我自己找到了答案。如果有人发现了这个问题,请点击这里。
Spring如何管理Hibernate会话?
默认情况下,Spring Boot在存储库级别应用事务管理。在这种情况下,当调用JpaRepository
方法(或通常任何Repository
方法)时,Spring将:
SessionFactory
创建新会话Repository
方法但是,如果将@Transactional
应用于服务类或方法,则Spring将在进入服务方法时打开会话和事务,并且将在现有事务中执行存储库方法。
有什么后果?
作为程序员......
@Transactional
。缓存仅适用于同一HibernateSession
。@Entity
个对象的等效性,而不是使用Java的==
运算符。@OneToMany
类(请参阅@Entity
而不是FetchMode.LAZY
)中的惰性集合(例如在FetchMode.EAGER
引用中)是专门使用的在@Transactional
- 注释方法另外,作为参考,以下链接非常有用:Multiple Transactions in single session
与Spring的许多其他方面一样,如果您愿意牺牲对应用程序的直接控制权,那么在这里可以获得很多东西。