Три подхода к настройке Spring JPA + Hibernate 5 - в чем разница? - PullRequest
1 голос
/ 04 июля 2019

Я обновляю существующий проект, чтобы использовать 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 во-первых?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...