簡體   English   中英

Spring Data JPA 和 Hibernate 用於創建 sessionFactory

[英]Spring Data JPA and Hibernate for creation of sessionFactory

Spring data jpa 是對 Jpa 的抽象,Spring data jpa 默認實現了 Hibernate ORM 。 為了使用休眠,我們創建了 sessionFactory。 但是為什么我們在使用 spring 數據 JPA 時不創建會話工廠?

這個問題混淆了一些與Spring、Hibernate和JPA相關的概念,讓我試着解開它們:

Spring data jpa 是對 Jpa 的抽象

在某種程度上,我猜。

Spring data jpa 默認實現 Hibernate ORM

嗯,沒有。 Spring Data 使用 Hibernate 作為 JPA API 的提供者。

為了使用休眠,我們創建 sessionFactory

嗯,是和不是。 Hibernate 可以通過兩種方式使用:

  • 通過與其專有 API 交互,即使用SessionFactorySession等。
  • 通過與它實現的 JPA API 交互,即EntityManagerFactoryEntityManager

Spring Data JPA 正在做后者。

為什么我們在使用 spring 數據 JPA 時不創建會話工廠?

因為 Spring Data 需要一個EntityManagerFactory 它不使用SessionFactory

在 Spring 中,這通常意味着您需要配置一個LocalContainerEntityManagerFactoryBean 使用 Spring Boot 時,這是自動為您完成的 - 請參見此處

    @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 將無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM