Penerapan Object Relational Mapping pada

advertisement
6
HASIL DAN PEMBAHASAN
Analisis Permasalahan Ketidaksesuaian
Untuk mendapatkan gambaran yang
lebih lengkap terhadap Ritel ERP (Ernita,
2008) yang akan dianalis, berikut ini
diuraikan deskripsi umum ERP untuk
perusahan Ritel tersebut.
1 Deskripsi Umum Aplikasi Ritel ERP
Sistem ERP Ritel yang dikembangkan
Ernita (2008) terdiri atas tiga mudul, antara
lain:
Modul pembelian (Business to Business)
 Purchase Requisition (PR) yang dikirim
oleh kepala gudang kepada pihak
pengadaan barang.
 Request for Quotation (RFQ) dan
Purchase Order (PO) yang dikirim oleh
bagian pengadaan kepada supplier.
 Demand Order (DO) yang dikirim oleh
supplier kepada bagian pengadaan
barang.
 Goods Receive yang diperiksa oleh
kepala gudang saat barang diterima.
 Manajemen Inventory.
 Daftar supplier.
Modul Penjualan (Business-to-Customer)
 Daftar katalog yang ditampilkan kepada
pelanggan.
 Submodul pemesanan (add to cart)
 Konfirmasi tagihan dan pembayaran.
 Pengantaran barang.
 Daftar pelanggan.
Modul akuntansi
 Jurnal buku besar (General Ledger)
 Konfirmasi tagihan dan pembayaran.
 Account Receivable (AR)
 Account Payable (AP)
 Manajemen kode akun.
Masing-masing modul pembangun Ritel
ERP tergabung pada satu basis data yang
terpusat.
2 Analisis Masalah Ketidaksesuaian
Aplikasi Ritel ERP membutuhkan basis
data dalam menjalankan proses bisnisnya.
Tiga modul utama pembangun aplikasi Ritel
ERP mengakses pada satu basis data yang
terpusat. Setiap modul mempunyai tabel
master untuk inisialisasi data dari
lingkungan proses bisnis aplikasi Ritel ERP
dan tabel transaksi sebagai hasil transaksi
saat menjalankan proses bisnisnya. Tabel
master dan tabel transaksi yang dirancang
untuk membangun aplikasi Ritel ERP dapat
dilihat pada Lampiran 1.
Pada penelitian ini, aplikasi Ritel ERP
dikembangkan
dengan
pendekatan
berorientasi objek menggunakan bahasa
pemrograman Java, sedangkan sistem
manajemen basis data yang digunakan
adalah basis data relasional. Oleh karena itu,
terdapat ketidaksesuaian (mismatch) yang
ditimbulkan pada perbedaan konsep
tersebut. Pada penelitian ini, tidak semua
aspek ketidaksesuaian ditemukan. Aspek
ketidaksesuaian yang muncul adalah aspek
granularity, identitas, asosiasi antarentitas,
dan navigasi data.
Uraian berikut memaparkan analisis
ketidaksesuaian pada aspek:
a Granularity
Ketidaksesuaian pada aspek granularity
terjadi karena pada basis data relasional
tidak mengenal user-defined-data-type atau
tipe data yang didefinisikan oleh pengguna.
Ketidaksesuaian aspek granularity yang
ditemukan pada penelitian ini terjadi saat
mendefinisikan properti address pada
entitas Supplier. atribut Address terdiri
atas street, town, state, zip_code.
Aribut address akan dipisahkan menjadi
class berbeda saat pembuatan DTO, akan
tetapi setelah dipetakan tetap masuk sebagai
proserti tabel PU_SUPPLIER.
b Identitas
Ketidaksesuaian pada aspek identitas
terkait dengan perbedaan pengenal identitas
objek dan tabel. Pada objek identitas
dibedakan menjadi nilai dan alamat
memorinya. Oleh karena itu, terdapat dua
notasi yang melambangkan kesamaan suatu
identitas, yaitu lambang sama dengan (==)
dan method equals(). Sebagai contoh
(a == b), berarti variabel a dan b
memegang alamat reference yang sama pada
memori, sedangkan (a.equals(b)),
secara lojik mempunyai nilai yang sama.
Pada basis data relasional, identitas dari
suatu tabel disebut dengan primary key.
Dengan demikian, sering kali terjadi objek
yang secara lojik sama (a.equals(b))
dan mewakili satu baris dalam tabel basis
data, tetapi objek tersebut tidak berada pada
satu lokasi alamat memori yang sama.
7
c Asosiasi
1 Melakukan Konfigurasi Basis Data
Kebanyakan entitas pada basis data
mempunyai keterhubungan dengan entitas
yang lainnya. Elemen yang menghubungkan
kedua tabel tersebut ditandai dengan foreign
key.
Tahap konfigurasi merupakan tahap awal
sebelum melakukan akses terhadap basis
data. Konfigurasi basis data disimpan pada
file jdbc.properties. Isi dari file
jdbc.properties adalah sebagai berikut:
Elemen penghubung dua objek ditandai
dengan
sebuah
reference
object.
Permasalahannya adalah reference object
bergantung pada arah dari asosiasinya
(direction of relationship). Apabila asosiasi
antara dua objek terjadi pada dua arah, maka
harus didefinisikan dua kali pada setiap
classnya. Akan tetapi foreign key pada tabel
relasional tidak mengenal arah dari
asosiasinya, karena asosiasi antara dua tabel
dihubungkan dengan tabel join.
1
2
3
4
5
6
7
8
9
10
Ketidaksesuaian pada aspek asosiasi
meliputi relasi one-to-one, one-to-many, dan
many-to-many. Masing-masing asosiasi
antarentitas bisa dilihat pada class diagram
dan ER diagram pada Lampiran 2 dan
Lampiran 3.
d Navigasi data
Ketidaksesuaian pada aspek navigasi
terkait
dengan
masalah
bagaimana
mengakses suatu objek yang berasal dari
objek lain. Menurut arahnya, navigasi data
terbagi menjadi dua macam, yaitu:
unidirectional dan bidirectional. Pada
konsep pemrograman berorientasi objek
konsep arah navigas menentukan suatu
objek dapat diakses melalui objek lain,
sedangkan pada basis data relasional konsep
arah navigasi tidak mempengaruhi proses
pengaksesan data dari tabel lain.
Pada konsep pemrograman berorientasi
objek, proses akses properti objek dari objek
lain bisa langsung menggunakan method
getter. Lain halnya dengan basis data
relasional,
properti
yang
menjadi
penghubung antara dua tabel yang berelasi
yaitu foreign key.
Perancangan dan Implementasi ORM
dan Design Pattern
Setelah
ditemukan
empat
aspek
ketidaksesuaian tersebut diimplementasikan
ORM. Selain itu juga diterapkan design
pattern
untuk
menghilangkan
ketidaksesuaian yang muncul pada tahap
analisis tersebut, meliputi:
jdbc.username=root
jdbc.password=admin
jdbc.url=jdbc:mysql://localhost:
3306/erp
jdbc.driver=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.
dialect.MySQL5InnoDBDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=create
hibernate.format_sql=true
Baris pertama sampai ke lima merupakan
properti konfigurasi koneksi basis data yang
berisi username, password, host dan port
basis data, dan library koneksi yang
digunakan.
Kode pada baris ke enam menentukan
jenis dialek SQL yang akan dipetakan. Baris
ke delapan adalah properti untuk
menampilkan hasil query yang telah diubah
ke dalam bentuk SQL. Baris ke sembilan
merupakan
properti
yang
berfungsi
mengotomasi pembuatan basis data dari
awal sampai akhir. Dan baris ke sepuluh
untuk menghasilkan query dengan format
SQL.
2 Membuat Class DTO (Data Transfer
Object)
DTO
merupakan
class
yang
merepresentasikan setiap tabel pada basis
data. DTO dibuat berdasarkan UML class
diagram yang telah dirancang. DTO berisi
class JavaBean yang setiap propertinya akan
merepresentasikan atribut-atribut pada tabel.
Skema
proses
pembuatan
DTO
diilustrasikan pada Gambar 4.
8
Product
-id : int
-prodName : string
-unitPrice : double
public class
private
private
private
//getter and
}
Product{
int id;
String prodName;
Double unitPrice;
setter method
product
PK
id : int
prod_name : varchar
unit_price : longint
Prod_ID
Prod_name
Unit
price
1
pupuk
100
2
bibit
200
Gambar 4 Skema Pembuatan DTO.
Ketidaksesuaian yang muncul pada tahap
analisis diatasi oleh ORM pada saat
merepresentasikan class DTO dan diakses
sebagai objek.
Uraian
berikut
menjelaskan
implementasi konsep ORM untuk mengatasi
ketidaksesuaian pada aspek granularity,
identitas, asosiasi, dan navigasi data.
a Aspek Granularity
Proses pemetaan untuk memecah entitas
menjadi entitas yang lebih kompleks pada
atribut address dalam entitas Supplier
menjadi satu entitas address ditulis sebagai
berikut:
- Class Supplier
1
2
3
4
5
6
7
@Entity
@Table(name = "PU_SUPLIER")
public class Supplier{
@Embedded
private Address address = new
Address();
}
-
Class Address
1
2
3
4
5
6
@Embeddable
public class Address {
private String street;
private String city;
private String zipCode;
}
Properti @Embeddable pada baris
pertama class Address mengindikasikan
bahwa class Address merupakan entitas
yang bisa dilekatkan atau dimasukan ke
dalam entitas lain. Properti @Embedded di
baris ke lima pada class Supplier
menandakan bahwa entitas Address
melekat pada entitas Supplier.
b Aspek Identitas
ORM mengatasi ketidaksesuaian pada
aspek identitas dengan menambah properti
identity pada setiap entitas atau class DTO
seperti pada potongan program berikut:
1
2
3
4
5
6
7
8
9
@Entity
@Table(name = "IN_ITEM")
public class Item{
@Id
@GeneratedValue(strategy=
GenerationType.AUTO)
@Column(name="id")
private Long id;
}
Kode pada baris pertama dan kedua
menandakan bahwa class tersebut mewakili
sebuah entitas pada basis data dengan nama
tabel IN_ITEM.
@Id pada baris ke empat merupakan
properti yang merepresentasikan primary
key, secara lojik properti @Id pada class a
berbeda dengan @Id pada class b. Dengan
demikian pengujian apakah isi class a sama
dengan class b bisa ditulis seperti berikut:
a.getid().equals(b.getId()).
Properti @GeneratedValue (strategy
=
GenerationType.AUTO
merupakan
pengisian id yang secara otomasi seperti
auto_increment pada tabel relasional.
c Aspek Asosiasi
Asosiasi antara dua entitas terdiri atas
one-to-one, one-to-many, dan many-tomany. Proses pemetaan asosiasi antara dua
entitas adalah sebagai berikut:
 One-to-one
Gambar 5 Pemetaan Asosiasi one-to-one.
9
Gambar 5 merupakan ilustrasi dari class
 One-to-many
Demand yang berasosiasi one-to-one dengan
class Order. Letak foreign key atau join
column ditambahkan pada entitas yang
mempunyai total participation pada asosiasi
yang menghubungkannya.
Pada entitas yang mempunyai asosiasi
dua
arah
(bidirectional)
diperlukan
penambahan properti mappedBy oleh
entitas yang tidak total participation (entitas
partial participation), sedangkan pada
entitas yang mempunyai asosiasi satu arah
(unidirectional) tidak perlu menambahkan
properti mappedBy.
Proses pemetaan dua class Demand dan
class Order merupakan contoh asosiasi dua
arah (association bidirectional) dan class
Demand bersifat
total participation.
Pemetaan class Demand dan class Order
dapat dituliskan sebagai berikut:
-
Class Order
1
2
3
4
5
6
@Entity
@Table(name="pu_order")
public class Order {
@OneToOne (mappedBy="order")
private Demand demand;
}
-
Class Demand
1
2
3
4
5
6
7
@Entity
@Table(name="pu_demand")
public class Demand {
@OneToOne
@JoinColumn (name="id_order")
private Order order;
}
Properti Join Column dimasukan pada
class Demand karena entitas Demand
mempunyai total participation. Dengan
demikian, objek Demand menentukan
asosiasi antara dua entitas tersebut.
Asosiasi one-to-one di atas disebut
biderectional karena masing-masing class
memerlukan
reference
yang
menghubungkannya. Baris empat dan baris
enam pada class Demand menandakan suatu
reference yang mewakili foreign key dari
entitas Order. Begitu pula pada class
Order, reference yang menghubungkannya
ditulis dengan mappedBy yang dituliskan
pada baris ke empat dan lima. Properti
mappedBy=”order” pada class Order
merujuk pada nama atribut order pada
class Demand.
Gambar 6 Pemetaan Asosiasi one-to-many.
Gambar 6 merupakan ilustrasi class
yang berasosiasi one-tomany dengan class RequisitionDetail.
Jadi setiap satu objek Requisition terdiri
atas banyak objek RequisitionDetail.
Requisition
Seperti halnya asosiasi one-to-one,
asosiasi one-to-many mempunyai join
column yang disimpan pada entitas yang
mempunyai total participation. Akan tetapi
pada asosiasi one-to-many, entitas yang
mempunyai total participation pasti berada
pada entitas yang berkardinalitas many.
Dengan demikian, dapat dikatakan join
column berada pada entitas dengan
kardinalitas many.
Class Requisition berasosiasi one-tomany dengan class RequisitionDetail.
Apabila asosiasinya bidirectional, maka
dapat
dikatakan
class
RequisitionDetail berasosiasi many-toone dengan class Requisition. Proses
pemetaannya ditulis sebagai berikut:
- Class RequisitionDetail
1
2
3
4
5
6
7
@Entity
@Table (name="pu_req_detail")
Public class RequisitionDetail {
@ManyToOne
@JoinColumn (name="id_req")
private Requisition requisition;
}
-
Class Requisition
1
2
3
4
5
6
7
8
9
@Entity
@Table(name="pu_req")
public class Requisition{
@OneToMany(mappedBy =
"requisition")
private List <RequisitionDetail>
reqDetail = new ArrayList
<RequisitionDetail> ();
}
Asosiasi many-to-one di atas bersifat
biderectional, sehingga properti join
10
column
berada pada entitas yang
berkardinalitas
many
yaitu
class
RequisitionDetail. Akan tetapi pada
entitas
yang
berkardinalitas
one
ditambahkan properti mappedBy sebagai
reference.
Properti asosiasi dan reference dalam
class RequisitionDetail ditulis pada
baris empat dan baris lima. Pada class
PurchaseRequisition, reference yang
menghubungkannya
ditulis
dengan
mappedBy seperti pada baris empat sampai
baris delepan.
Apabila
asosiasinya
unidirectional,
properti
mappedBy
pada
class
Requisition
dihilangkan.
Properti
mappedBy = “requisition” merujuk
kepada atribut “requisition” pada class
RequisitionDetail.
 Many to many
-
Class Group
1
2
3
4
5
6
7
8
9
@Entity
@Table(name = "ad_group")
public class Group {
@ManyToMany(mappedBy=
"groups")
private List <Modul>
moduls = new ArrayList
<Modul>();
}
- Class Modul
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Entity
@Table(name="ad_modul")
public class Modul {
@ManyToMany
@JoinTable (name =
"ad_modul_group",
joinColumns={
@JoinColumn(name=
"id_ad_modul")},
inverseJoinColumns={
@JoinColumn(name=
"id_ad_group")})
private List <Group> groups =
new ArrayList < Group>();
}
Peoperti Join table dimasukan pada
properti yang mempunyai total participation
yaitu class Modul. Objek Modul
menentukan asosiasi pada kedua entitas
tersebut.
Gambar 7 Pemetaan Asosiasi many-to-many.
Gambar 7 merupakan ilusrasi class
Group berasosiasi many-to-many dengan
class Modul. Kedua entitas yang berasosiasi
many-to-many dihubungkan oleh reference
berupa join tabel. Join tabel memiliki
dua buah atribut foreign key yang berasal
dari masing-masing entitas.
Atribut join tabel dimasukan pada
entitas yang memilki total participation
pada asosiasi tersebut. Properti mappedBy
ditambahkan
kepada
entitas
partial
participation apabila asosiasinya dua arah
(bidirectional), sedangkan pada entitas yang
mempunyai
asosiasi
satu
arah
(unidirectional) tidak perlu menambahkan
properti mappedBy.
Proses pemetaan asosiasi di atas
merupakan asosiasi dua arah (association
bidirectional) dan entitas Modul mempunyai
total participation. Pemetaan class Group
dan class Modul dituliskan seperti berikut:
Asosiasi many-to-many di atas bersifat
biderectional karena masing-masing class
memerlukan
reference
yang
menghubungkannya. Properti many-to-many
pada class Modul ditulis pada baris empat.
Kemudian
reference
yang
menghubungkannya berupa join table
yang terdiri atas identity dari masing-masing
entitas. Properti join table ditulis pada
baris lima sampai empat belas dalam class
Modul. Dalam class Group, reference yang
menghubungkannya ditulis pada baris empat
sampai
baris
delapan.
Properti
mappedBy=”groups” pada class Group
merujuk pada nama atribut groups pada
class Modul.
Hasil pemetaan dari asosiasi many-tomany antara dua class tersebut adalah dua
tabel hasil transformasi dari objek yaitu
AD_MODUL dan AD_GROUP kemudian satu
tabel asosiasi AD_MODUL_GROUP.
d Aspek Navigasi data
Pada konsep pemrograman berorientasi
objek, proses akses properti objek dari objek
11
lain bisa langsung menggunakan method
getter. Contoh:
- Class Item
1
2
3
4
5
6
7
@Entity
@Table(name = "IN_ITEM")
public class Item {
@ManyToOne
@JoinColumn(name="id_brand")
private Brand brand;
}
Class Item mempunyai variabel brand
dengan tipe data Brand seperti ditulis pada
baris ke enam. Untuk mengakses nilai
brand dengan tipe data Brand pada class
Item menggunakan method getter seperti
berikut:
invItem.getInvProdBrand.getName();
Apabila arah navigasinya unidirectional,
maka tidak terdapat properti entitas Item
pada class Brand, sehingga class Brand
tidak bisa mengakses properti entitas Item.
Tetapi
apabila
arah
navigasinya
bidirectional, maka pada class Brand
terdapat properti entitas Item seperti
berikut:
-
Class Brand
1
2
3
4
5
6
@Entity
public class Brand {
@OneToMany(mappedBy="brand")
private List <Item> item = new
ArrayList<Item>();
}
Properti mappedBy pada baris ke tiga
menandakan
bahwa
class
tersebut
mempunyai asosiasi bidirectional. Untuk
mengakses variabel item dengan tipe data
Item
dari class Brand menggunakan
method getter seperti berikut:
invProdBrand.getInItem.getName();
Basis data relasional tidak mengenal
konsep arah navigasi dalam mengakses data.
Properti yang menjadi penghubung antara
dua tabel yang berelasi yatiu foreign key.
Tabel ITEM dan BRAND mempunyai relasi
one-to-many kemudian foreign key berada
pada tabel ITEM. Selama ada foreign key
yang menghubungkan kedua tabel, proses
query yang melibatkan kedua tabel bisa
dijalankan.
Query berikut merupakan query untuk
mengakses
properti
item
dengan
berdasarkan id_brand pada tabel ITEM.
Select * from IN_ITEM i left
outer join IN_PROD_BRAND pb on
i.id=pb.id where i.id=123
Properti left outer join menandakan
bahwa foreign key berada pada tabel ITEM.
3 Membuat Fungsi Akses Data
Pada penelitian ini, DAO pattern
digunakan untuk proses enkapsulasi fungsi
untuk mengakses data ke dalam lapisan yang
berbeda, sehingga aplikasi tidak perlu
mengetahui detail proses suatu data diakses.
DAO berisi method (fungsi) untuk
mengakses dan memanipulasi data. Pada
penerapannya,
DAO
dapat
diimplementasikan dengan native query atau
bahasa query basis data relasional (Structure
Query language). DAO juga dapat
diimplementasikan dengan konsep ORM
dengan menggunakan HQL (Hibernate
Query Language).
Proses pembuatan fungsi-fungsi akses
dan manipulasi data memanfaatkan konsep
design pattern, yaitu factory method dan
singleton. Sebelum melakukan akses dan
manipulasi data, terlebih dulu dibuat objek
dataSource yang berisi referensi dari
properti koneksi basis data. DataSource
memanggil referensi properti koneksi basis
data yang ada pada file konfigurasi
jdbc.properties, antara lain: username,
password, server dan port, nama url basis
data, dan jenis driver RDBMS. Objek
dataSource dan semua objek DAO hanya
diinstansiasi satu kali selama aplikasi
berjalan. Objek dataSource dimasukan ke
setiap DAO ketika DAO diinstansiasi,
sehingga proses koneksi basis data tidak
dilakukan secara berulang-ulang melainkan
cukup dipanggil apabila diperlukan.
Framework ORM yang digunakan untuk
proses pengaksesan data pada penelitian ini
adalah Hibernate. DAO diimplementasikan
menggunakan HQL (Hibernate Query
Language). DAO berisi method untuk
mengakses dan memanipulasi data seperti
create, update, delete, insert, select, dan
join.
Pada penelitian ini, proses pembuatan
objek dataSource dan proses memasukan
dataSource ke dalam semua DAO
dilakukan menggunakan Spring Framework
dengan teknik Inversion of Control (IoC).
Teknik IoC dalam pembuatan objek
12
dataSource dapat dilihat pada Lampiran
5.
Selain objek dataSource, objek yang
diperlukan
untuk
mengakses
data
menggunakan
ORM
adalah
objek
sessionFactory. Seperti halnya objek
dataSource, objek sessionFactory
bersifat singleton, jadi objeknya hanya
dibuat sekali sepanjang aplikasi berjalan.
Objek sessionFactory dipanggil oleh
setiap class DAO yang mengakses basis
data.
membuat
objek
SessionFactory
session yang diperlukan untuk proses
transaksi yang berlangsung saat mengakses
data. Session merupakan objek yang
hanya sekali pakai, digunakan untuk
melakukan transaksi basis data dan setelah
selesai transaksi, session langsung ditutup.
Siklus hidup objek session berbeda
dengan
objek
sessionFactory,
sessionFactory dibuat sekali sepanjang
aplikasi berjalan, sedangkan session
dibuat selama proses suatu
transaksi
berlangsung. Session bertanggungjawab
selama proses transaksi, session tidak
bisa ditutup sebelum transaksi berhasil dan
session akan melakukan rollback apabila
transaksi gagal.
Pada penelitian ini, proses pembuatan
sessionFactory dan proses memasukan
objek sessionFactory ke dalam semua
DAO dilakukan menggunakan Spring
framework dengan teknik Inversion of
Control (IoC) seperti halnya pada
pembuatan dan penggunaan dataSource.
Teknik IoC untuk sessionFactory dapat
dilihat pada Lampiran 5.
session dibuat oleh class
HibernateDaoSupport melalui method
getHibernateTemplate.
Method
getHibernateTemplate
bertujuan
Objek
membersihkan lapisan aplikasi dari kode
pengaksesan data yang berulang-ulang.
Method
getHibernateTemplate
membuat kode program untuk penyimpanan
objek ke dalam basis data menjadi sebagai
berikut:
public class CartDaoHibernate extends
HibernateDaoSupport{
public void save(Cart cart) {
getHibernateTemplate().saveOr
Update(cart);
}
}
Kode program untuk pengambilan objek
dari basis data ditulis sebagai berikut:
 Mengambil objek cart sesuai dengan
id tertentu
public Cart getById(Long cartId) {
Cart cart = (Cart)
getHibernateTemplate().
load(Cart. class, cartId);
getHibernateTemplate().initialize
(cart);
return cart;
}
 Mengambil objek cart berdasarkan
status yang sedang aktif.
Public
Cart
getByStatus
(String
status){
Cart cart = (Cart) getHibernate
Template.find(“from
Cart
c
where
c.status=?”, “active”);
return cart;
}
 Mengambil
objek
detailCart
berdasarkan cart tertentu.
Public
DetailCart
getByCart
(Cart
Cart){
DetailCart detailCart = (Detail
Cart) getHibernateTemplate.find(“from
CartDetail
cd
left
join
fetch
cd.cart”);
return detailCart;
}
 Mengambil semua objek cart.
public List<Cart> getAll() {
return
getHibernateTemplate().
find("from Cart");
}
Kode program untuk menghapus objek
cart:
public void delete(Cart cart) {
getHibernateTemplate().delete
(cart);
}
4 Penyederhanaan Fungsi Akses Data
Aplikasi Ritel ERP pada penelitian ini
terdiri atas 50 class DTO yang masingmasing mempunyai interface DAO untuk
akses dan manipulasi data seperti insert,
select, atau delete. Agar mudah diakses,
semua DAO dikumpulkan berdasarkan
submodul ERP ke dalam interface Service.
Interface
Service
merupakan
implementasi dari facade pattern, yaitu
menyederhanakan
fungsi-fungsi
yang
terlihat rumit dengan mengelompokkan
fungsi-fungsi tersebut ke dalam beberapa
interface sehingga menghasilkan fungsi
yang lebih sederhana dan mudah digunakan.
Proses penyederhanaan 50 class DTO
menghasilkan tujuh interface Service,
13
lain AccountPayableService,
AccountReceivableService,
Admin
GeneralLedgerService,
Service,
InventoryService, OrderService, dan
PurchaseService. Proses memasukan
DAO ke dalam Service menggunakan
antara
5 Membuat Skema Basis Data.
teknik Inversion of Control oleh Spring
Framework. Teknik IoC untuk Service
dapat dilihat pada Lampiran 6.
Properti <prop key = "hibernate.
hbm2ddl.auto">
${hibernate.
hbm2ddl.auto} </prop> adalah property
untuk membuat skema basis data. Variabel
${hibernate.hbm2ddl.auto} merujuk
pada properti hibernate.hbm2ddl.auto
pada file jdbc.properties. nilai
variabelnya adalah create. Ada beberapa
Implementasi dari semua DAO pada
Service dituliskan sebagai berikut:
public
class
OrderServiceImpl
implements OrderService {
DebiturDao orderDebiturDao;
CartDao orderCartDao;
}
Objek Service adalah properti yang
akan diakses oleh lapisan aplikasi dalam
proses pengaksesan basis data. Akan tetapi,
sebelumnya dilakukan teknik Declarative
Transaction terhadap Service dengan
menerapkan konsep proxy pattern, yaitu
pola yang merancang suatu objek mewakili
kontrol atau akses objek lain bertindak
seolah-olah objek tersebut melakukannya
Declarative Transaction merupakan
suatu teknik untuk medeklarasikan semua
transaksi dalam suatu file konfigurasi untuk
menangani semua proses transaksi tanpa
harus membuat kode-kode program untuk
menangani transaksi secara eksplisit. Proses
Declarative Transaction ditulis pada file
hibernate.ctx.xml.
Proses Declarative Transaction dimulai
dengan mengatur transaksi oleh objek
session. Objek session yang digunakan
saat transaksi dikendalikan oleh class proxy
yang dihasilkan melalui teknik Declarative
Transaction. Ketika lapisan aplikasi
memanggil Service untuk mengakses basis
data, method Service tidak mengakses
basis data secara langsung. Akan tetapi
Service memanggil moduleXXXService
pada file hibernate.ctx.xml untuk
membuat class proxy yang berisi fungsifungsi transaksi (begin, commit, rollback).
Fungsi-fungsi transaksi tersebut dimasukan
ke dalam Session melalui method
getHibernateTemplate, sehingga tidak
perlu menuliskan proses transaksi secara
programatik
mengendalikan
Session,
karena transaksi dilakukan secara deklaratif
oleh class proxy melalui method
getHibernateTemplate.
pilihan yang bisa digunakan untuk properti
hbm2ddl.auto,
yaitu
create-drop
artinya Hibernate akan membuat semua
tabel
pada
saat
inisialisasi
sessionFactory.
Begitu
sessionFactory ditutup, semua tabel
akan dihapus. Pilihan yang ke dua adalah
create
artinya
pada
saat
sessionFactory
dijalankan
akan
membuat semua tabel dan pada saat
sessionFactory
ditutup tabel yang
dihasilkan tidak akan dihapus.
Selain properti hbm2ddl.auto, yang
digunakan pada proses pembuatan skema
basis
data
adalah
properti
hibernate.show_sql.
Properti
hiberntae.show_sql akan menampilkan
SQL
yang
digunakan
saat
query
menggunakan HQL. Skema basis data yang
dihasilkan digambarkan pada Lampiran 6.
6 Menyatukan
Lapisan
dengan Lapisan Aplikasi
Persistensi
Framework yang digunakan pada lapisan
aplikasi dan presentasi adalah Java Server
Faces (JSF). JSF adalah UI (User Interface)
framework untuk aplikasi Java berbasis web
dengan konsep MVC yang mendukung user
interface berbasis komponen. Setiap action
yang dilakukan memerlukan class controller
atau backing bean. Pada class controller
biasanya dilakukan proses pengaksesan
terhadap basis data.
Class controller yang akan mengakses
atau memanipulasi data memanggil method
Service sesuai data yang diperlukan.
Misalnya jika diperlukan data Item, maka
DAO yang berisi method untuk mengakses
data Item disimpan pada ItemDao,
kemudian ItemDao dimasukan ke dalam
InventoryService. Oleh karena itu,
untuk mengakses data Item dipanggil
InventoryService.
Dan
terakhir
mengatur konfigurasi controller untuk JSF
pada file faces-config.xml. method
Service yang digunakan oleh controller
14
dideklarasikan pada file konfigurasi facesconfig.xml.
Contoh class controller yang mengakses
data adalah seperti berikut:
1
2
3
4
5
6
7
8
9
10
11
12
public class InventoryController {
private InventoryService
inventoryService;
private Item item;
@PostConstruct
public void initBean(){
}
public String save(){
item.setStatus("active");
InventoryService.saveItem (item);
return "success";}
}
Method initBean pada baris lima dan
enam
yang
dianotasi
oleh
@PostConstruct, artinya method ini
dipanggil
setelah
constructor
ListInvController
dipanggil yang
bertujuan inisialisasi data pada halaman
tampilannya. Class Controller di atas
bertugas untuk menyimpan objek item ke
dalam basis data seperti dituliskan pada
baris sepuluh
Class Controller yang telah dibuat
dideklarasikan pada file konfigurasi facesconfig.xml seperti berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<managed-bean>
<managed-bean-name>
InventoryController
</managed-bean-name>
<managed-bean-class>
ilkom.erp.web.controller.
inventory.InventoryController
</managed-bean-class>
<managed-bean-scope>
Request
</managed-bean-scope>
<managed-property>
<property-name
inventoryService
</property-name>
<value>
#{moduleInventoryService}
</value>
</managed-property>
</managed-bean>
Baris ke tiga merupakan penulisan
deklarasi nama controller yang akan
dipanggil pada lapisan presentasi. Nama
controller tersebut berisi class controller
yang didefinisikan pada baris ke enam dan
baris ke tujuh. Properti yang dipunyai
controller tersebut didefinisikan pada baris
ke 12 sampai baris ke 19.
Evaluasi
Proses pemetaan menggunakan ORM
dituliskan dengan kode sederhana, hal ini
sangat membantu pihak pengembang dalam
melakukan query data. ORM menghilangkan
kode-kode exception dan native query yang
terlihat berantakan dan tidak terstruktur.
ORM
mengabstraksi
penggunakan
Relational Data Base Management System
(RDBMS), sehingga mendukung jenis
RDBMS manapun. Query yang digunakan
tidak menurut pada satu jenis RDBMS,
melainkan menggunakan query language
yang disediakan oleh ORM.
Pemanfaatan konsep design pattern
menghasilkan kode program yang lebih rapi
dan terstruktur, serta memudahkan untuk
proses integrasi antara lapisan basis data dan
lapisan aplikasi. Dengan penerapan konsep
design pattern, kode program aplikasi dapat
dengan
mudah
dipelihara
untuk
pengembangan
aplikasi
selanjutnya.
Perbedaan fungsi akses data tanpa
menggunakan ORM, teknik Inversion of
Controls,
dan
teknik
Declarative
Transaction, akses data menggunakan ORM
tetapi tanpa penerapan teknik Inversion of
Controls
dan
teknik
Declarative
Transaction, dan fungsi akses data
menggunakan ORM, Inversion of Controls,
dan teknik Declarative Transaction dapat
dilihat pada Lampiran 7.
Kekurangan dari konsep ORM yang
diterapkan dalam pengembangan sistem
ERP yaitu apabila terjadi perubahan,
penambahan, dan pengurangan domain
model harus meliputi seluruh aspek dari
mulai pembuatan DTO, DAO, Service,
dan deklarasi pada file konfigurasi.
KESIMPULAN DAN SARAN
Kesimpulan
Pada penelitian ini, tidak semua aspek
ketidaksesuaian
ditemukan.
Aspek
ketidaksesuaian
yang
muncul
pada
penelitian ini hanya meliputi empat aspek,
yaitu aspek granularity, identitas, navigasi
data, dan asosiasi antarentitas. Implementasi
konsep ORM terbukti dapat menghilangkan
ketidaksesuian
yang
muncul
karena
perbedaan antara aplikasi yang dibangun
dengan pendekatan berorientasi objek dan
basis data relasional yang digunakan.
Download