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进行交互,即使用SessionFactorySession等。
  • 通过与它实现的JPA API进行交互,即EntityManagerFactoryEntityManager

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将无法正常工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...