Pada kesempatan kali ini saya akan membahas integrasi spring mvc dan hibernate jpa. Spring mvc merupakan sebuah subproject dari spring portfolio yang sangat banyak digunakan didunia industri pada saat ini. Bagian terpenting dari spring mvc adalah dispatcher servlet. Dispatcher servlet berfungsi sebagai container untuk menerima request dan mengirimkan response kepada user. Mengenai hibernate jpa silahkan dilihat pada halaman berikut.
Langsung saja ya..
Pada contoh kasus ini saya mempunyai sebuah model(M) dengan nama Mahasiswa.
Berikut property atau attribute yang terlibat didalamnya :
Nim,Nama,dan jurusan.
package org.kris.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Mahasiswa {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String nim;
private String nama;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getNim() {
return nim;
}
public void setNim(String nim) {
this.nim = nim;
}
}
Kemudian kita buatkan interface DAO nya. Interface ini berfungsi untuk melakukan proses CRUD/ Create Read Update Delete.
public interface MahasiswaDAO {
public void insert(Mahasiswa mahasiswa);
public void delete(Mahasiswa mahasiswa);
public Mahasiswa getById(Long id);
public List<Mahasiswa> getAll();
}
Setelah itu kita buatkan implementasi dari kelas dao tersebut.
package org.kris.impl;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.kris.dao.MahasiswaDAO;
import org.kris.entity.Mahasiswa;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public class MahasiswaImpl implements MahasiswaDAO {
@PersistenceContext
private EntityManager em;
public void insert(Mahasiswa mahasiswa) {
em.merge(mahasiswa);
}
public void delete(Mahasiswa mahasiswa) {
em.remove(em.merge(mahasiswa));
}
public Mahasiswa getById(Long id) {
return em.find(Mahasiswa.class, id);
}
public List<Mahasiswa> getAll() {
return em.createQuery("from Mahasiswa").getResultList();
}
}
Pada kode diatas digunakan beberapa anotasi seperti @Repository, @Transactional, @PersistentContext. Nah anotasi diatas memiliki fungsi masing-masing. Anotasi @Transactional berfungsi untuk memberikan sifat transactional pada masing-masing method. Kita bisa meletakkan anotasi tersebut pada detail setiap method dengan spesifikasi yang berbeda-beda. Dengan menggunakan anotasi ini maka masing-masing method akan bersifat transactional dimana kita tidak perlu melakukan proses transaksi secara manual.
Setelah itu kita buatkan persistence unitnya :
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="Jamu-DemoPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.kris.entity.Mahasiswa</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/jamu"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
Persistence Unit diatas berisi konfigurasi dari hibernate,termasuk didalamnya mapping kelas, dan sebagainya. Setelah itu kita buatkan applicationContext.xml…
<context:component-scan base-package="org.kris.impl"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"/>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven/>
Didalam spring sebuah kelas yang di inject dapat disebut dengan bean. File applicationContext.xml diatas merupakan sebuah container yang dapat menampung banyak bean. Elemen <context:component-scan base-package=”org.kris.impl”/> akan melakukan scanning dan injeksi terhadap kelas-kelas yang terdapat didalam paket tersebut. Didalam paket tersebut spring akan membaca anotasi @Repository yang telah didefiniskan sebelumnya. Untuk mengelola entity didalam JPA maka kita membutuhkan entity manager. Nah, entity manager ini didapat dari entity manager factory yang telah kita inject seperti contoh program diatas. Kemudian kita buatkan pengelolaan terhadap transaksi dengan menggunakan JpaTransactionManager. Untuk mengaktifakn anotasi @Transactional maka kita gunakan element <tx:annotation-driven/>.
Setelah itu kita buatkan dispatcher servlet nya ….
<context:component-scan base-package="org.kris.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
Konfigurasi diatas adalah untuk melakukan injeksi terhadap kelas InternalResourceViewResolver yang digunakan untuk menangani view yang digunakan.
Kemudian kita dapat buatkan viewnya.
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
.........................................
<form:form commandName="mahasiswa">
<table>
<tr>
<td>NIM</td>
<td><form:input path="nim"/></td>
</tr><tr>
<td>NAMA</td>
<td><form:input path="nama"/> </td>
</tr><tr>
<td>
<input type="submit" value="simpan"/>
</td>
</tr>
</table>
</form:form>
..................
Kode diatas kita dapat menggunakan taglib dari spring untuk melakukan binding dari data model mahasiswa. Kemudian kita buatkan controllernya :
@Controller
public class MahasiswaController {
@Autowired
public MahasiswaDAO mahasiswaDAO;
@RequestMapping(value = "/jsp/mahasiswaForm.htm", method = RequestMethod.GET)
public ModelMap getMahasiswa(@RequestParam(value = "id", required = false) Long id) {
Mahasiswa mahasiswa;
if (id == null) {
mahasiswa = new Mahasiswa();
} else {
mahasiswa = mahasiswaDAO.getById(id);
}
return new ModelMap(mahasiswa);
}
}
Kelas controller diatas perlu diberikan anotasi @Controller. Ini menandakan bahwa kelas tersebut adalah kelas controller. Untuk melakukan pemanggilan bean maka kita dapat menggunakan anotasi @Autowired. Anotasi @RequestMapping akan melakukan mapping halaman yang diinginkan, dalam contoh diatas adalah halaman mahasiswaForm,htm dan Http method get. Method getMahasiswa() akan melakukan pengecekan, apakah ada id yang diterima, jika tidak maka buat mahasiswa baru, jika ada maka cari id tersebut. Kemudian kita kirimkan datanya dengan ModelMap.
Setelah itu kita dapat membuat view untuk menampilkan data dari mahasiswa :
...
<table>
<tr>
<th>NIM</th>
<th>NAMA</th>
<th></th>
<th></th>
</tr>
<c:forEach items="${mahasiswaList}" var="m">
<tr>
<td>${m.nim}</td>
<td>${m.nama}</td>
<td><a href="mahasiswaForm.htm?id=${m.id}">edit</a></td>
<td><a href="mahasiswaDelete.htm?id=${m.id}">hapus</a></td>
</tr>
</c:forEach>
...
Halaman diatas akan menampilkan seluruh data mahasiswa. Untuk mendapatkan data mahasiswa kita bisa menggunakan JSTL. Pada halaman tersebut juga disediakan link untuk melakukan proses pengeditan dan penghapusan data mahasiswa. Caranya adalah dengan mengirimkan parameter berupa id dari mahasiswa.
Berikut hasil akhir dari controller mahasiswa.
package org.kris.controller;
import java.util.List;
import org.kris.dao.MahasiswaDAO;
import org.kris.entity.Mahasiswa;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.view.RedirectView;
@Controller
public class MahasiswaController {
@Autowired
public MahasiswaDAO mahasiswaDAO;
@RequestMapping(value = "/jsp/mahasiswaForm.htm", method = RequestMethod.GET)
public ModelMap getMahasiswa(@RequestParam(value = "id", required = false) Long id) {
Mahasiswa mahasiswa;
if (id == null) {
mahasiswa = new Mahasiswa();
} else {
mahasiswa = mahasiswaDAO.getById(id);
}
return new ModelMap(mahasiswa);
}
@RequestMapping(value = "/jsp/mahasiswaForm.htm", method = RequestMethod.POST)
public RedirectView postMahasiswa(@ModelAttribute Mahasiswa mahasiswa) {
mahasiswaDAO.insert(mahasiswa);
return new RedirectView("mahasiswaList.htm");
}
@RequestMapping(value = "/jsp/mahasiswaDelete.htm", method = RequestMethod.GET)
public RedirectView deleteMahasiswa(@ModelAttribute Mahasiswa mahasiswa) {
mahasiswaDAO.delete(mahasiswa);
return new RedirectView("mahasiswaList.htm");
}
@RequestMapping(value = "/jsp/mahasiswaList.htm", method = RequestMethod.GET)
public List<Mahasiswa> getAllMahasiswa() {
return mahasiswaDAO.getAll();
}
}
Langkah terakhir adalah melakukan konfigurasi terhadap web.xml.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Konfigurasi diatas intinya adalah meload spring kedalam root application context dan melakukan mapping terhadap dispatcher servlet. Nah, mudah bukan, untuk lebih lengkapnya baca disini,Dikembangkan sendiri ya….
Ini listing programnya
Hasil dari Jamu nih
Posted by jasoet | February 23, 2010, 12:20 amHe…he….. iya mas
Posted by krissadewo | February 23, 2010, 4:59 amkak lama ga jumpa n chat..
Decorator di Spring MVC dah bisa sekarang..
Baru cari artikel kalo misalkan inputan datanya relationshipnya banyak sekali.
Misal class faktur berelasi dengan consumer, dan petugas dan itembarang.
Sedang item barang sendiri berelasi dengan class Barang. Ya perlu sedikit usaha. untuk itu..
Pusing pokoke..
Posted by mudzakkirtoha | March 25, 2010, 1:21 pmUntuk table yang ada relasinya gimana mas cara menyimpannya?
Posted by Arul | April 27, 2010, 11:21 amBiasanya saya pake cascade, jadi kita tinggal bermain di setternya saja,
Posted by krissadewo | May 2, 2010, 7:48 amuntuk tabel yang berelasi contohnya di maestric.com
Posted by Mudzakkir | July 1, 2010, 9:10 pmmas, kalo di tambahkan report, pake jasper report gimana ya mas?ada referensinya?
Posted by ian | March 5, 2011, 6:36 pmSama dengan applikasi desktop biasa, refrensinya belum punya
Kalau mau lebih coba pelajari itext dan apachi poi…
Posted by krissadewo | March 18, 2011, 10:19 am