Spring, Hibernate e un'origine dati JNDI

1. Panoramica

In questo articolo creeremo un'applicazione Spring utilizzando Hibernate / JPA con un'origine dati JNDI.

Se vuoi riscoprire le basi di Spring e Hibernate, dai un'occhiata a questo articolo.

2. Dichiarazione dell'origine dati

2.1. Sistema

Poiché stiamo utilizzando un'origine dati JNDI, non la definiremo nella nostra applicazione, la definiremo nel nostro contenitore dell'applicazione.

In questo esempio, utilizzeremo la versione 8.5.x di Tomcat e la versione 9.5.x del database PostgreSQL.

Dovresti essere in grado di replicare gli stessi passaggi utilizzando qualsiasi altro contenitore di applicazioni Java e un database di tua scelta (a patto che tu abbia i jar JDBC appropriati!).

2.2. Dichiarazione dell'origine dati nel contenitore dell'applicazione

Dichiareremo la nostra origine dati nel file / conf / server.xml all'interno del file elemento.

Supponendo che il server del database sia in esecuzione sulla stessa macchina del contenitore dell'applicazione e che il database previsto sia denominato postgres e che il nome utente sia dotato di password pass1234 , una risorsa sarebbe simile a questa:

Tieni presente che abbiamo chiamato la nostra risorsa jdbc / BaeldungDatabase . Questo sarà il nome da utilizzare quando si fa riferimento a questa origine dati.

Abbiamo anche dovuto specificare il tipo e il nome della classe del driver del database. Perché funzioni, devi anche posizionare il jar corrispondente in / lib / (in questo caso, il jar JDBC di PostgreSQL).

I restanti parametri di configurazione sono:

  • auth = "Container" - significa che il container effettuerà l'accesso al gestore delle risorse per conto dell'applicazione
  • maxTotal, maxIdle e maxWaitMillis : sono i parametri di configurazione della connessione al pool

Dobbiamo anche definire un ResourceLink all'interno del fileelemento in / conf / context .xml, che sarebbe simile a:

Nota che stiamo usando il nome che abbiamo definito nella nostra risorsa in server.xml .

3. Utilizzo della risorsa

3.1. Impostazione dell'applicazione

Definiremo ora una semplice applicazione Spring + JPA + Hibernate utilizzando la configurazione Java pura.

Inizieremo definendo la configurazione del contesto Spring (tieni presente che ci stiamo concentrando su JNDI qui e assumendo che tu conosca già le basi della configurazione di 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 }

Nota che abbiamo un esempio completo della configurazione nell'articolo Spring 4 e JPA con Hibernate.

Per creare il nostro bean dataSource , dobbiamo cercare la risorsa JNDI che abbiamo definito nel nostro contenitore dell'applicazione. Lo memorizzeremo nella chiave persistence-jndi.properties (tra le altre proprietà):

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

Nota che nella proprietà jdbc.url stiamo definendo un nome root da cercare: java: comp / env / (questi sono i valori predefiniti e corrispondono al componente e all'ambiente) e quindi lo stesso nome che abbiamo usato in server.xml : jdbc / BaeldungDatabase .

3.2. Configurazione JPA - Modello, DAO e servizio

Useremo un modello semplice con l' annotazione @Entity con un ID generato e un nome :

@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 }

Definiamo un semplice repository:

@Repository public class FooDao { @PersistenceContext private EntityManager entityManager; public List findAll() { return entityManager .createQuery("from " + Foo.class.getName()).getResultList(); } }

Infine, creiamo un semplice servizio:

@Service @Transactional public class FooService { @Autowired private FooDao dao; public List findAll() { return dao.findAll(); } }

Con questo, hai tutto ciò di cui hai bisogno per utilizzare la tua origine dati JNDI nella tua applicazione Spring.

4. Conclusione

In questo articolo, abbiamo creato un'applicazione Spring di esempio con una configurazione JPA + Hibernate che funziona con un'origine dati JNDI.

Notare che le parti più importanti sono la definizione della risorsa nel contenitore dell'applicazione e la ricerca della risorsa JNDI nella configurazione.

E, come sempre, il progetto completo può essere trovato su GitHub.