三种不同的方法来配置Spring JPA + Hibernate 5-有什么区别?

时间:2019-07-04 16:03:44

标签: java spring hibernate spring-data-jpa

我正在升级现有项目以使用Spring Data JPA和存储库,而不是使用Hibernate查询数据的一些DAO。

因此,我设法创建了一个有效的有效配置:

public class PersistenceConfiguration
{
    (...)

    public DataSource dataSource()
    {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        (...)

        return dataSource;
    }

    @Bean( "jpaProperties" )
    public Properties jpaProperties()
    {
        Properties properties = new Properties();

        (...)

        return properties;
    }

    @Bean(name = "entityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory()
    {
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setPersistenceUnitName( "entityManagerFactory" );
        factory.setPackagesToScan( "my.package.domain" );
        factory.setJpaVendorAdapter( getHibernateJpaVendorAdapter() );
        factory.setJpaProperties( jpaProperties() );
        factory.setDataSource( dataSource() );

        return factory;
    }

    @Bean( name = "transactionManager" )
    public PlatformTransactionManager transactionManager( EntityManagerFactory entityManagerFactory )
    {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory( entityManagerFactory );
        return txManager;
    }

    protected HibernateJpaVendorAdapter getHibernateJpaVendorAdapter()
    {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl( false );
        vendorAdapter.setDatabase( (this.databasePlatform.contains( "MySQL" ) ? Database.MYSQL : Database.H2) );
        vendorAdapter.setDatabasePlatform( this.databasePlatform );
        return vendorAdapter;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation()
    {
        return new PersistenceExceptionTranslationPostProcessor();
    }
}

如您所见,我使用了LocalContainerEntityManagerFactoryBean-我遵循了Baeldung tutorialLocalEntityManagerFactoryBean是另一个选择,但是本教程的作者声称它“不太灵活”。然后我开始更深入地研究,只是为了了解Spring Data JPA的工作原理,我发现还有第三种方法-LocalSessionFactoryBean

我想我不能打扰并且仅仅坚持任何可行的方法,但是我对Spring还是很陌生,我希望避免至少在不理解它的情况下粘贴粘贴代码。

这是我到目前为止发现的:

LocalSessionFactoryBean

如果使用它,我可以使用Hibernate访问SessionFactory并查询数据。

Official documentation说:

  

...和Hibernate BeanContainer集成将立即注册。

是什么使SessionFactory bean可用?如果我不需要访问LocalSessionFactoryBean,就不应该使用SesionFactory

LocalContainerEntityManagerFactoryBeanLocalEntityManagerFactoryBean

我在讨论中发现了它们之间的区别here,但是尽管我不清楚一些概念,但我知道对于我自成一体的小我可以坚持{{1 }}。从迅速更改为LocalEntityManagerFactoryBean,表明它没有LocalEntityManagerFactoryBean#setPackagesToScan方法。

对于前者,这是否意味着整个应用程序的软件包树正在自动扫描?

关于#setDataSource的事-它会自动获取DataSource bean还是我应该坚持使用#setDataSource

LocalContainerEntityManagerFactoryBean的初衷是什么?

0 个答案:

没有答案