【发布时间】:2021-02-13 14:11:55
【问题描述】:
Spring data jpa 是对 Jpa 的抽象,Spring data jpa 默认实现 Hibernate ORM。为了使用hibernate,我们创建了sessionFactory。但是为什么我们在使用 Spring Data JPA 时不创建会话工厂?
【问题讨论】:
标签: hibernate spring-data-jpa sessionfactory
Spring data jpa 是对 Jpa 的抽象,Spring data jpa 默认实现 Hibernate ORM。为了使用hibernate,我们创建了sessionFactory。但是为什么我们在使用 Spring Data JPA 时不创建会话工厂?
【问题讨论】:
标签: hibernate spring-data-jpa sessionfactory
这个问题混淆了一些与Spring、Hibernate和JPA相关的概念,让我试着解开它们:
Spring data jpa 是对 Jpa 的抽象
在某种程度上,我猜。
Spring data jpa 默认实现 Hibernate ORM
嗯,不。 Spring Data 使用 Hibernate 作为 JPA API 的提供者。
为了使用hibernate,我们创建了sessionFactory
嗯,是的,也不是。 Hibernate 可以通过两种方式使用:
SessionFactory、Session 等。EntityManagerFactory 和EntityManager
Spring Data JPA 正在做后者。
为什么我们在使用 Spring Data JPA 时不创建会话工厂?
因为 Spring Data 需要 EntityManagerFactory。它不使用SessionFactory。
在 Spring 中,这通常意味着您需要配置一个 LocalContainerEntityManagerFactoryBean。使用 Spring Boot 时,这会自动为您完成 - 请参阅 here:
@Bean
@Primary
@ConditionalOnMissingBean({ LocalContainerEntityManagerFactoryBean.class, EntityManagerFactory.class })
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder factoryBuilder) {
Map<String, Object> vendorProperties = getVendorProperties();
customizeVendorProperties(vendorProperties);
return factoryBuilder.dataSource(this.dataSource).packages(getPackagesToScan()).properties(vendorProperties)
.mappingResources(getMappingResources()).jta(isJta()).build();
}
@ConditionalOnMissingBean({ LocalContainerEntityManagerFactoryBean.class, EntityManagerFactory.class }) 注释的作用是创建一个LocalContainerEntityManagerFactoryBean仅当您自己没有提供这样的 bean。这意味着您可以提供自己的 LocalContainerEntityManagerFactoryBean,如果您愿意,可以使用它。
此外,如果您要在没有 Spring Boot 的情况下使用 Spring Data JPA,您将必须自己提供 LocalContainerEntityManagerFactoryBean,否则 Spring Data 将无法工作。
【讨论】: