我正在升级现有项目以使用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 tutorial,LocalEntityManagerFactoryBean
是另一个选择,但是本教程的作者声称它“不太灵活”。然后我开始更深入地研究,只是为了了解Spring Data JPA的工作原理,我发现还有第三种方法-LocalSessionFactoryBean
。
我想我不能打扰并且仅仅坚持任何可行的方法,但是我对Spring还是很陌生,我希望避免至少在不理解它的情况下粘贴粘贴代码。
这是我到目前为止发现的:
LocalSessionFactoryBean
:
如果使用它,我可以使用Hibernate访问SessionFactory
并查询数据。
...和Hibernate BeanContainer集成将立即注册。
是什么使SessionFactory
bean可用?如果我不需要访问LocalSessionFactoryBean
,就不应该使用SesionFactory
?
LocalContainerEntityManagerFactoryBean
与LocalEntityManagerFactoryBean
:
我在讨论中发现了它们之间的区别here,但是尽管我不清楚一些概念,但我知道对于我自成一体的小我可以坚持{{1 }}。从迅速更改为LocalEntityManagerFactoryBean
,表明它没有LocalEntityManagerFactoryBean
和#setPackagesToScan
方法。
对于前者,这是否意味着整个应用程序的软件包树正在自动扫描?
关于#setDataSource
的事-它会自动获取DataSource bean还是我应该坚持使用#setDataSource
?
LocalContainerEntityManagerFactoryBean
的初衷是什么?