Я обновляю существующий проект, чтобы использовать Spring Data JPA и репозитории вместо нескольких DAO, которые запрашивают данные с помощью Hibernate.
Итак, мне удалось создать действительную конфигурацию, которая работает:
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 , а LocalEntityManagerFactoryBean
- еще один вариант, но автор учебника утверждает, что он "менее гибок". Затем я начал копать глубже, чтобы понять, как работает Spring Data JPA, и обнаружил, что существует третий путь - LocalSessionFactoryBean
.
Полагаю, я не мог бы заморачиваться и просто придерживаться того, что работает, но я совсем новичок в Spring и хотел бы избежать копирования-вставки кода, по крайней мере, не пытаясь понять его.
Вот что я обнаружил до сих пор:
LocalSessionFactoryBean
:
Если я его использую, я могу получить доступ к SessionFactory
и запросить данные, используя Hibernate.
Официальная документация говорит:
... и интеграция Hibernate BeanContainer будет зарегистрирована сразу после установки.
Что делает боб SessionFactory
доступным? Я не должен использовать LocalSessionFactoryBean
, если мне не нужен доступ к SesionFactory
?
LocalContainerEntityManagerFactoryBean
против LocalEntityManagerFactoryBean
:
Я нашел обсуждение с объяснением того, как они отличаются здесь , но хотя некоторые понятия там мне не ясны, я понимаю, что из-за своей маленькой автономности я мог бы придерживаться LocalEntityManagerFactoryBean
. Быстрое изменение с на LocalEntityManagerFactoryBean
показывает, что у него нет методов #setPackagesToScan
и #setDataSource
.
Для первых, означает ли это, что все дерево пакетов приложения сканируется автоматически?
А как насчет #setDataSource
- он просто подхватит компонент DataSource автоматически или мне нужно просто вставить LocalContainerEntityManagerFactoryBean
?
Какова цель LocalEntityManagerFactoryBean
во-первых?