Spring, Hibernate и источник данных JNDI

Spring, Hibernate и источник данных JNDI

1. обзор

В этой статье мы создадим приложение Spring с использованием Hibernate / JPA с источником данныхJNDI.

Если вы хотите заново открыть для себя основы Spring и Hibernate, посмотритеthis article.

2. Объявление источника данных

2.1. система

Поскольку мы используем источник данных JNDI, мы не будем определять его в нашем приложении, мы определим его в нашем контейнере приложения.

В этом примере мы собираемся использовать версию 8.5.x дляTomcat и версию 9.5.x базы данныхPostgreSQL.

Вы должны быть в состоянии повторить те же шаги, используя любой другой контейнер приложения Java и базу данных по вашему выбору (при условии, что у вас есть соответствующие JDBC-фляги для этого!).

2.2. Объявление источника данных в контейнере приложения

Мы объявим наш источник данных в файле<tomcat_home>/conf/server.xml внутри элемента<GlobalNamingResources>.

Предполагая, что сервер базы данных работает на том же компьютере, что и контейнер приложения, и что предполагаемая база данных называетсяpostgres, а имя пользователя -example с паролемpass1234, ресурс будет выглядят так:

Обратите внимание, что мы назвали наш ресурсjdbc/exampleDatabase. Это будет имя, которое будет использоваться при обращении к этому источнику данных.

Нам также пришлось указать его тип и имя класса драйвера базы данных. Чтобы он работал, вы также должны поместить соответствующий jar-файл в<tomcat_home>/lib/ (в данном случае JDBC-файл PostgreSQL).

Остальные параметры конфигурации:

  • auth=”Container” - означает, что контейнер будет подписываться на диспетчер ресурсов от имени приложения

  • maxTotal, maxIdle, иmaxWaitMillis - параметры конфигурации соединения пула

Мы также должны определитьResourceLink внутри элемента<Context> в<tomcat_home>/conf/context.xml,, который будет выглядеть так:

Обратите внимание, что мы используем имя, которое мы определили в нашемResource вserver.xml.

3. Использование ресурса

3.1. Настройка приложения

Теперь мы собираемся определить простое приложение Spring + JPA + Hibernate с использованием чистой конфигурации Java.

Мы начнем с определения конфигурации контекста Spring (имейте в виду, что мы сосредоточены здесь на JNDI и предполагаем, что вы уже знаете основы конфигурации Spring):

@Configuration
@EnableTransactionManagement
@PropertySource("classpath:persistence-jndi.properties")
@ComponentScan("com.example.hibernate.cache")
@EnableJpaRepositories(basePackages = "com.example.hibernate.cache.dao")
public class PersistenceJNDIConfig {

    @Autowired
    private Environment env;

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory()
      throws NamingException {
        LocalContainerEntityManagerFactoryBean em
          = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());

        // rest of entity manager configuration
        return em;
    }

    @Bean
    public DataSource dataSource() throws NamingException {
        return (DataSource) new JndiTemplate().lookup(env.getProperty("jdbc.url"));
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    // rest of persistence configuration
}

Обратите внимание, что у нас есть полный пример конфигурации в статьеSpring 4 and JPA with Hibernate.

Чтобы создать bean-компонентdataSource, нам нужно найти ресурс JNDI, который мы определили в нашем контейнере приложения. Мы сохраним это в ключеpersistence-jndi.properties (среди других свойств):

jdbc.url=java:comp/env/jdbc/exampleDatabase

Обратите внимание, что вjdbc.url property мы определяем корневое имя, которое нужно искать:java:comp/env/ (это значения по умолчанию и соответствуют компоненту и среде), а затем то же имя, которое мы использовали вserver.xml: jdbc/exampleDatabase.

3.2. Конфигурация JPA - модель, DAO и сервис

Мы собираемся использовать простую модель с аннотацией@Entity со сгенерированнымиid иname:

@Entity
public class Foo {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME")
    private String name;

    // default getters and setters
}

Давайте определим простой репозиторий:

@Repository
public class FooDao {

    @PersistenceContext
    private EntityManager entityManager;

    public List findAll() {
        return entityManager
          .createQuery("from " + Foo.class.getName()).getResultList();
    }
}

И наконец, давайте создадим простой сервис:

@Service
@Transactional
public class FooService {

    @Autowired
    private FooDao dao;

    public List findAll() {
        return dao.findAll();
    }
}

Благодаря этому у вас есть все необходимое для использования источника данных JNDI в приложении Spring.

4. Заключение

В этой статье мы создали пример приложения Spring с настройкой JPA + Hibernate, работающей с источником данных JNDI.

Обратите внимание, что наиболее важными частями являются определение ресурса в контейнере приложения и поиск ресурса JNDI в конфигурации.

И, как всегда, полный проект можно найтиover on GitHub.