1. Обзор
В этой статье мы создадим приложение Spring с использованием Hibernate/JPA с источником данных JNDI .
Если вы хотите заново открыть для себя основы весны и зимней спячки, ознакомьтесь с этой статьей .
2. Объявление источника данных
2.1. Система
Поскольку мы используем источник данных JNDI, мы не будем определять его в нашем приложении, мы определим его в нашем контейнере приложения.
В этом примере мы будем использовать версию 8.5.x Tomcat и версию 9.5.x базы данных PostgreSQL .
Вы должны быть в состоянии повторить те же шаги, используя любой другой контейнер Java-приложения и базу данных по вашему выбору (при условии, что у вас есть соответствующие JDBC-банки для этого!).
2.2. Объявление источника данных в контейнере приложения
Мы объявим ваш источник данных в /conf/ server.xml файл внутри элемента .
Предполагая, что сервер базы данных работает на той же машине , что и контейнер приложения , и что предполагаемая база данных называется postgres , а имя пользователя – baeldung с паролем pass1234 , ресурс будет выглядеть следующим образом:
Обратите внимание, что мы назвали наш ресурс jdbc/База данных Baeldung . Это имя будет использоваться при ссылке на этот источник данных.
Нам также пришлось указать его тип и имя класса драйвера базы данных. Чтобы он работал, вы также должны поместить соответствующий jar в /lib/ (в данном случае Postgresql JDBC jar).
Остальные параметры конфигурации:
- auth=”Контейнер” – означает, что контейнер будет входить в систему диспетчера ресурсов от имени приложения
- maxTotal, maxIdle, и maxWaitMillis – это параметры конфигурации соединения с пулом
Мы также должны определить ссылку Resource внутри элемента в /conf/context .xml, которая будет выглядеть следующим образом:
Обратите внимание, что мы используем имя, которое мы определили в нашем Ресурсе в server.xml .
3. Использование Ресурса
3.1. Настройка приложения
Сейчас мы определим простое приложение Spring + JPA + Hibernate, используя чистую конфигурацию Java.
Мы начнем с определения конфигурации контекста Spring (имейте в виду, что здесь мы фокусируемся на JNDI и предполагаем, что вы уже знаете основы конфигурации Spring):
@Configuration @EnableTransactionManagement @PropertySource("classpath:persistence-jndi.properties") @ComponentScan("com.baeldung.hibernate.cache") @EnableJpaRepositories(basePackages = "com.baeldung.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 и JPA с Hibernate.
Чтобы создать свой источник данных bean, нам нужно найти ресурс JNDI, который мы определили в нашем контейнере приложения. Мы сохраним это в persistence-jndi.properties key (среди других свойств):
jdbc.url=java:comp/env/jdbc/BaeldungDatabase
Обратите внимание, что в свойстве jdbc.url мы определяем корневое имя для поиска: java:comp/env/ (это значения по умолчанию и соответствуют компоненту и среде), а затем то же имя, которое мы использовали в server.xml : jdbc/база данных BaeldungDatabase .
3.2. Конфигурация JPA – Модель, DAO и сервис
Мы собираемся использовать простую модель с аннотацией @Entity с сгенерированным id и именем :
@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 ListfindAll() { return entityManager .createQuery("from " + Foo.class.getName()).getResultList(); } }
И, наконец, давайте создадим простой сервис:
@Service @Transactional public class FooService { @Autowired private FooDao dao; public ListfindAll() { return dao.findAll(); } }
Таким образом, у вас есть все необходимое для использования источника данных JNDI в приложении Spring.
4. Заключение
В этой статье мы создали пример приложения Spring с настройкой JPA + Hibernate, работающего с источником данных JNDI.
Обратите внимание, что наиболее важными частями являются определение ресурса в контейнере приложения и поиск ресурса JNDI в конфигурации.
И, как всегда, полный проект можно найти на GitHub .