如何解决Spring Data JPA和Hibernate用于创建sessionFactory
Spring数据jpa是Jpa的抽象,并且Spring数据jpa默认情况下实现Hibernate ORM。为了使用休眠模式,我们创建了sessionFactory。但是为什么在使用Spring Data JPA时我们不创建会话工厂?
解决方法
这个问题混淆了与Spring,Hibernate和JPA相关的许多概念,让我尝试解开它们:
Spring数据jpa是对Jpa的抽象
我想是这样的。
Spring数据jpa默认情况下实现Hibernate ORM
嗯,不。 Spring Data使用Hibernate作为JPA API的提供程序。
为了使用休眠模式,我们创建了sessionFactory
是的,是的,不是的。休眠有两种使用方式:
- 通过与其专有API进行交互,即使用
SessionFactory
,Session
等。 - 通过与它实现的JPA API进行交互,即
EntityManagerFactory
和EntityManager
Spring Data JPA正在做后者。
为什么在使用spring数据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 })
注释的作用是,仅当您自己未提供此类bean时,它才会创建LocalContainerEntityManagerFactoryBean
。这意味着您可以提供自己的LocalContainerEntityManagerFactoryBean
,并在需要时使用它。
此外,如果要在没有Spring Boot的情况下使用Spring Data JPA,则必须自己提供LocalContainerEntityManagerFactoryBean
,否则Spring Data将无法正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。