Spring, Hibernate dan Sumber Data JNDI

1. Gambaran keseluruhan

Dalam artikel ini, kami akan membuat aplikasi Spring menggunakan Hibernate / JPA dengan sumber data JNDI.

Sekiranya anda ingin menemui semula asas-asas Spring dan Hibernate, baca artikel ini.

2. Menyatakan Sumber Pangkalan Data

2.1. Sistem

Oleh kerana kita menggunakan sumber data JNDI, kita tidak akan menentukannya dalam aplikasi kita, kita akan menentukannya dalam wadah aplikasi kita.

Dalam contoh ini, kita akan menggunakan Tomcat versi 8.5.x dan pangkalan data PostgreSQL versi 9.5.x.

Anda seharusnya dapat meniru langkah yang sama menggunakan wadah aplikasi Java lain dan pangkalan data pilihan anda (selagi anda mempunyai balang JDBC yang sesuai!).

2.2. Menyatakan Sumber Data pada Bekas Aplikasi

Kami akan menyatakan sumber data kami dalam / conf / server.xml fail di dalam unsur.

Dengan mengandaikan bahawa pelayan pangkalan data berjalan pada mesin yang sama dengan wadah aplikasi, dan bahawa pangkalan data yang dimaksudkan dinamakan postgres , dan bahawa nama pengguna adalah baeldung dengan kata laluan pass1234 , sumber akan kelihatan seperti ini:

Perhatikan bahawa kami telah menamakan sumber kami jdbc / BaeldungDatabase . Ini akan menjadi nama yang akan digunakan ketika merujuk sumber data ini.

Kami juga harus menentukan jenis kelas dan nama pemacu pangkalan data. Agar berfungsi, anda juga mesti meletakkan balang yang sesuai di / lib / (dalam kes ini, balang JDBC PostgreSQL).

Parameter konfigurasi yang tinggal adalah:

  • auth = "Container" - bermaksud bahawa kontena akan masuk ke pengurus sumber bagi pihak aplikasi
  • maxTotal, maxIdle, dan maxWaitMillis - adalah parameter konfigurasi sambungan kolam

Kita juga mesti menentukan ResourceLink di dalamelemen dalam / conf / konteks .xml, yang akan kelihatan seperti:

Perhatikan bahawa kami menggunakan nama yang kami tetapkan dalam Sumber kami di server.xml .

3. Menggunakan Sumber

3.1. Menetapkan Aplikasi

Kami akan menentukan aplikasi Spring + JPA + Hibernate sederhana menggunakan konfigurasi Java tulen sekarang.

Kita akan mulakan dengan menentukan konfigurasi konteks Spring (ingatlah bahawa kita memberi tumpuan kepada JNDI di sini dan menganggap bahawa anda sudah mengetahui asas-asas konfigurasi 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 }

Perhatikan bahawa kita mempunyai contoh lengkap konfigurasi pada artikel Spring 4 dan JPA dengan Hibernate.

Untuk membuat kacang dataSource , kita perlu mencari sumber JNDI yang kita tentukan di wadah aplikasi kita. Kami akan menyimpannya dalam kunci persistence-jndi.properties (antara sifat lain):

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

Perhatikan bahawa dalam harta jdbc.url kita mentakrifkan nama akar kepada wajah untuk: java: comp / env / (ini adalah mungkir dan sesuai dengan komponen dan alam sekitar) dan kemudian nama yang sama kita digunakan dalam server.xml : JDBC / Pangkalan Data Baeldung .

3.2. Konfigurasi JPA - Model, DAO dan Perkhidmatan

Kami akan menggunakan model ringkas dengan anotasi @Entity dengan id dan nama yang dihasilkan :

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

Mari tentukan repositori mudah:

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

Dan terakhir, mari buat perkhidmatan mudah:

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

Dengan ini, anda mempunyai semua yang anda perlukan untuk menggunakan sumber data JNDI anda dalam aplikasi Spring anda.

4. Kesimpulan

Dalam artikel ini, kami telah membuat contoh aplikasi Spring dengan persediaan JPA + Hibernate yang berfungsi dengan sumber data JNDI.

Perhatikan bahawa bahagian yang paling penting adalah definisi sumber dalam bekas aplikasi dan mencari sumber JNDI pada konfigurasi.

Dan, seperti biasa, projek penuh boleh didapati di GitHub.