Spring, Hibernate и JNDI Източник на данни

1. Общ преглед

В тази статия ще създадем пролетно приложение, използващо Hibernate / JPA с JNDI източник на данни.

Ако искате да преоткриете основите на Spring и Hibernate, разгледайте тази статия.

2. Деклариране на източника на данни

2.1. Система

Тъй като използваме JNDI източник на данни, няма да го дефинираме в приложението си, а в контейнера за приложения.

В този пример ще използваме 8.5.x версия на Tomcat и версията 9.5.x на базата данни PostgreSQL.

Би трябвало да можете да репликирате същите стъпки, като използвате всеки друг контейнер за приложения на Java и база данни по ваш избор (стига да имате подходящи JDBC буркани за него!).

2.2. Деклариране на източника на данни в контейнера за приложения

Ще декларираме нашия източник на данни във файла / conf / server.xml във файла елемент.

Ако приемем, че сървърът на базата данни работи на същата машина като контейнера за приложения и че предвидената база данни се нарича postgres и че потребителското име е baeldung с парола pass1234 , ресурсът ще изглежда така:

Обърнете внимание, че ние нарекохме нашия ресурс jdbc / BaeldungDatabase . Това ще бъде името, което ще се използва при препратка към този източник на данни.

Също така трябваше да посочим неговия тип и името на класа на драйвера на базата данни. За да работи, трябва също да поставите съответния буркан в / lib / (в този случай JDBC буркан на PostgreSQL).

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

  • auth = ”Container” - означава, че контейнерът ще влиза в диспечера на ресурси от името на приложението
  • maxTotal, maxIdle и maxWaitMillis - са конфигурационните параметри на връзката към пула

Трябва също да дефинираме ResourceLink вътре велемент в / conf / context .xml, който би изглеждал така:

Имайте предвид, че използваме името, което определихме в нашия Ресурс в server.xml .

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

3.1. Задаване на приложението

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

Ще започнем с дефиниране на конфигурацията на Spring 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 с хибернация.

За да създадем нашия компонент dataSource , трябва да потърсим ресурса JNDI, който дефинирахме в нашия контейнер за приложения. Ще съхраним това в ключ persistence-jndi.properties (наред с други свойства):

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

Имайте предвид, че в свойството jdbc.url дефинираме коренно име, което да търсим: java: comp / env / (това са настройки по подразбиране и съответстват на компонент и среда) и след това същото име, което използвахме в server.xml : jdbc / База данни на Baeldung .

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

Ще използваме прост модел с анотацията @Entity с генериран идентификатор и име :

@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 ресурса в конфигурацията.

И както винаги, пълният проект може да бъде намерен в GitHub.