【问题标题】:Spring Data JPA and Hibernate for creation of sessionFactorySpring Data JPA 和 Hibernate 用于创建 sessionFactory
【发布时间】: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


    【解决方案1】:

    这个问题混淆了一些与Spring、Hibernate和JPA相关的概念,让我试着解开它们:

    Spring data jpa 是对 Jpa 的抽象

    在某种程度上,我猜。

    Spring data jpa 默认实现 Hibernate ORM

    嗯,不。 Spring Data 使用 Hibernate 作为 JPA API 的提供者。

    为了使用hibernate,我们创建了sessionFactory

    嗯,是的,也不是。 Hibernate 可以通过两种方式使用:

    • 通过与其专有 API 交互,即使用 SessionFactorySession 等。
    • 通过与它实现的 JPA API 交互,即EntityManagerFactoryEntityManager

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

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 2019-06-14
      • 2019-07-20
      • 1970-01-01
      • 2017-05-29
      • 2015-05-02
      • 1970-01-01
      • 2015-05-19
      • 2017-07-17
      相关资源
      最近更新 更多