Pemrograman Lanjut (IN316C)
Dosen Pengampuh :
Radius Tanone, S.Kom., M.Cs Tadonny Vani, S.Kom
Object Relational Mapping (ORM)-2
Mahasiswa mampu memahami konsep ORM dan menerapkan
dalam program
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
1. Object-relational mapping (ORM) berfungsi untuk memetakan
entitas menjadi tabel dan atribut menjadi kolom tabel
2. Pemetaan dapat dikategorikan menjadi 4, yaitu :
a) Basic Mapping
b) Relationship Mapping
c) Composition Mapping
d) Inheritance Mapping
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Contoh Entitas
Hasil Pemetaan
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Anotasi Dasar
Anotasi dasar berguna untuk meng-customise
tabel, primary key, dan kolom
Berikutnya kita akan melihat teknik anotasi dasar
yang meliputi :
Tables
Primary Keys
Attributes
Access Type
Collection of Basic Types
Map of Basic Types
@Table
Anotasi @javax.persistence.Table memungkinkan kita untuk
mengubah nilai default suatu tabel.
Misalnya : kita dapat menentukan NAMA TABEL yang akan
disimpan di database. Apabila anotasi @Table ini dihilangkan,
maka nama tabel akan diambil dari nama ENTITAS.
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
@SecondaryTable &
@SecondaryTables
Kadang-kadang, apabila kita perlu melakukan penyebaran
data ke dalam banyak tabel.
@SecondaryTable berguna untuk menghubungkan tabel
tambahan dengan suatu entitas.
@SecondaryTables (ada „s‟) berguna apabila tabel
tambahannya ada lebih dari satu
Contoh Penggunaan
SecondaryTable
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Hasil Pemetaan
1 entitas -> 3 Tabel
PrimaryKey
JPA mewajibkan entitas untuk memiliki suatu identifier yang akan dipetakan menjadi primary key
Primary key dapat berupa simpel atau komposit
Primary key simpel harus berkorespondensi dengan satu atribut dari entitas
@javax.persistence.Id berguna untuk menandai suatu atribut sebagai unique identifier dan dapat berupa salah satu tipe berikut :
Primitive Java types : byte, int, short, long, char
Wraooer classes of primitive Java types : Byte, Integer, Short, Long Character
Arrays of primitive or wrapper types : int[], Integer[], etc.
Strings, numbers, and dates : java.lang.String, java.math.BigInteger, java.util.Date, java.sql.Date
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Enitas Buku disertai
Generated Identifier
@Column
Anotasi @javax.persistence.Column berguna untuk mendefinisikan property dari suatu kolom
Dengan menggunakan anotasi ini, kita dapat menentukan NAMA
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Customizing Mapping
for the Book Entity
Contoh : kita mengubah nama kolom „title‟ dan „nbOfPage‟, panjang dari „description‟ serta mengharuskan nilai NOT NULL pada beberapa kolom
Tabel Book
The updatable and insertable settings default to true, which means that any attribute can be inserted or updated in the database. You can set them to false when you want the persistence provider to ensure that it wil not insert or upadate the data to the table in response to changes in the entity
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
@Temporal
Di dalam kode java, kita dapat menggunakan java.util.Date dan
java.util.Calendar untuk menyimpan dalam bentuk tanggal, jam, atau millisecond
Untuk menspesifikasikan hal ini di dalam ORM, kita dapat menggunakan anotasi @javax.persistence.Temporal
Contoh : Entitas Customer
dengan 2 atribut @Temporal
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Access Type
Selama ini kita melakukan anotasi pada „atribut‟ entitas
Cara lain adalah dengan memberikan anotasi pada property (getter method). Cara ini sama saja, hanya ada perbedaan pada saat
Anotasi pada Property
(Getter)
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Collection of Basic Types
Sejak JPA 2.0, kita dapat melakukan anotasi terhadap tipe data collection dengan menggunakan @ElementCollection dan
@CollectionTable
@ElementCollection digunakan untuk memberitahu bahwa atribut bertipe java.util.Collection berisikan tipe data yang lain
@CollectionTable memungkinkan kita untuk meng-customise detail dari tabel collection
Contoh Entitas Book
memiliki atribut ‘Tag’
„Tag‟
merupakan
collection berisi String
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Tabel yang dihasilkan
Note : apabila @CollectionTable tidak digunakan, maka nama tabel default-nya adalah “BOOK_TAG”
Map of Basic Types
Pada dasarnya, pemetaan tipe data „Map‟ dapat dilakukan sama halnya seperti pemetaan „Collection‟
Pada Map kita perlu menentukan kolom Key dan Value
Contoh kasus :pada album CD, sebuah track dapat memiliki POSISI (key) dan TITLE (value)
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Contoh entitas CD disertai
tipe data Map
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Materi Lanjutan
Relationship Mapping
Inheritance Mapping
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Relationship Mapping
Di dalam pemrograman berorientasi objek, kita mengenal adanya asosiasi antar class yang satu dengan class yang lainnya
Melalui asosiasi ini, suatu objek dapat mengakibatkan objek lain untuk menjalankan suatu fungsi/method
Ada beberapa jenis asosiasi yang terdapat antar class
Asosiasi ini memiliki arah : unidirectional (satu arah) atau bidirectional (dua arah)
Kita mengenal sintaks DOT(.) untuk melakukan navigasi method-method di dalam suatu object
Contoh : cuscomer.getAddress().getCountry() berarti melakukan navigasi dari object customer ke Address lalu ke Country
Asosiasi unidirection antar
dua class
Di dalam UML, untuk merepresentasikan asosiasi unidirectional antar dua class, kita dapat menggunakan tanda panah, sbb :
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Asosiasi bidirectional antar
dua class
Sedangkan untuk menunjukkan asosiasi bidirectional, kita tidak perlu menggunakan tanda panah sbb :
Didalam java, hal ini berarti Class1 memiliki atribut bertipe Class2, dan Class2 memiliki atribut bertipe Class1.
Multiplicity pada asosiasi
class
Suatu asosiasi dapat juga memiliki multiplicity atau cardinality
Setiap ujung dari asosiasi dapat menentukan berapa banyak object yang terlibat di dalam asosiasi tsb.
Contoh berikut : suatu instance Class1 merujuk/refer pada nol atau lebih instance Class2
Pada UML :
0..1 berarti kita akan memiliki minimal nol object dan maksimal satu object. 1 berarti kita hanya memiliki satu instance/objeck
1..” berarti kita hanya memiliki satu atau lebih instance/object 3..6 berarti kita dapat memiliki antara 3 s/d 6 instance/object
Pada java asosiasi yang menggambarkan lebih dari satu object harus menggunakan salah satu tipe data collection yaitu : java.util.Collection, java.util.Set, java.util.List, atau
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Relationship pada RDBMS
Berbeda dengan yang terjadi di dunia RDBMS, kita hanya mengenal
adanya kumpulan antar RELATIONAL (disebut : tabel) yang berarti apaun yang kita modelkan di dalam ERD pastilah merupakan suatu tabel.
Untuk memodelkan asosiasi, kita tidak memiliki LIST, SET, atau MAP, kita hanya memiliki TABEL
Di dalam java, ketika kita memiliki asosiasi antar satu class dengan class lainnya, maka di dalam database nantinya kita akan memiliki TABLE
REFERERENCE
REFERENCE ini dapat dimodelkan menjadi dua cara : Menggunakan FOREIGN KEY (join column)
Cara 1
Relationship menggunakan JOIN COLUMN
Sebagai contoh, misalkan seorang CUSTOMER memiliki satu ADDRESS, yang berarti relati one-to-one
Didalam Java, kita akan memiliki class Customer dengan atribut Address Di dalam database, kita dapat memiki tabel CUSTOMER yang menunjuk
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Cara 2
Relationship menggunakan JOIN TABLE
Cara yang kedua adalah menggunakan JOIN TABLE
Tabel CUSTOMER tidak menyimpan foreign key dari ADDRESS lagi Kita gunakan tabel tambahan yang dibuat untuk menampung informasi
Entity Relationship
Entity relationship dibagi menjadi 4 jenis : @OneToOne
@OneToMany @ManyToOne @ManyToMany
Setiap anoasi tersebut dapat digunakan untuk alur unidirectional ataupun bidirectional
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Teknik Pemetaan di Java
Untuk menyatakan class manakah yang akan menjadi OWNING SIDE dan class mana yang akan menjadi INVERSE SIDE, kita harus menggunakan elemen mappedBy di dalam anotasi @OneToOne, @OneToMany, dan @ManyToMany
mappedBy ini akan mengidentifikasi atribut yang menjadi pemilik relasi dan wajib digunakan untuk relasi yang bersifat bidirectional.
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Kasus 1
Asosiasi Unidirectional antara Customer dan Address @OneToOne
Pada relasi unidirectional, entitas Customer memiliki atribut bertipe Address, sbb :
Relasi ini bersifat OneToOne dan satu arah dari Customer ke Address Customer adalah pemilik relasi (OWNER)
Di dalam database, artinya bahwa tabel CUSTOMER akan memiliki foreign key yang mengacu pada tabel ADDRESS)
Source Code : Customer dengan satu Address
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Customizing
Entitas Customer menggunakan anotasi
Kita dapat melakukan customizing juga terhadap mapping, dengan
menggunakan dua buah anotasi yaitu @OneToOne dan @JoinCulomn sbb:
@OneToMany Unidirectional
Relasi OneToMany digunakan pada saat satu object dapat mengacu ke banyak objek yang lain
Misalnya : subuah purchase order dapat terdiri dari beberapa order line Order adalah sisi “ONE” (source) dan OrderLine adalah sisi “Many” (target)
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Entitas dan Tabel Order berisi OrderLines
Customizing
Entitas Order menggunakan anotasi JoinTable
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Customizing
Entitas Order menggunakan anotasi JoinColumn
Aturan default untuk relasi unidirectional OneToMany adalah dengan menggunakan JOIN TABLE, tetapi kita dapat mengubahnya menjadi menggunakan FOREIGN KEY dengan menggunakan anotasi
Tabel yang dihasilkan @JoinColumn
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Asosiasi bidirectional antara Customer dan Address @ManyToMany
Pada relasi bidirectional, kita perlu mengubah relasi dengan menambahkan atribut customer ke dalam entitas Address
Note : pada diagram class UML, atribut yang merepresentasikan relasi tidak ditunjukkan
Contoh Kasus
@ManyToMany Bidirectional
Contoh : sebuah Album CD dapat diciptakan oleh beberapa Artist, dan seorang artist dapat muncul dibeberapa Album CD
Dengan mengambil asumsi bahwa entitas Artist adalah pemilik relasi (Owner), maka berarti CD berarti bertindak sebagai reverse owner dan harus menggunakan elemen mappedBy pada anotasi @ManyToMany
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
One CD is Created by Several Artists
mappedBy akan memberitahukan engine persistence, bahwa „appearsOnCDs‟ adalah nama atribut dari entitas pemilik.
Satu artist dapat muncul pada banyak album CD
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Fetching Relationship
Parameter “fetch” sangat penting, karena apabila salah dipergunakan, akan menyebabkan masalah performance di aplikasi ini.
Setiap anotasi memiliki nilai fetch default yang harus kita waspadi EAGER akan me-load semua data ke dalam memori sehingga
pengaksesan database nantinya menjadi minimal
LAZY tidak akan memenuhi memori karena kitalah yang menentukan object mana yang perlu di-load. Namun, dengan teknik ini, kita harus mengakses database setiap saat.
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Ordering Relationship
Pada relasi OneToMany atau ManyToMany, entitas akan melibatkan collection/sekumpulan object
Di dalam java, collection ini biasanya bersifat unordered (tdk terurut). Sama halnya dengan RDMBS, record di dalam tabel pun tidaklah terurut
Untuk itu, apabila kita menginginkan suatu list terurut, maka kita perlu melakukan sorting secaramanual di dalam program atau menggunakan JPQL yang ditambahkan clausa order By.
JPA memiliki mekanisme yang lebih mudah, yaitu menggunakan anotasi di dalam relasi entitas menggunakan : @OrderBy
@OrderBy
Dengan menggunakan anotasi @OrderBy, pengurutan elemen di dalam suatu collection dilakukan pada saat asosiasi entitas diakses :
Contoh Kasus :
User dapat menulis News mengenai Musick atau buku News berisi teks yang ditampilkan di website
Setelah news dipublikasi, maka user dapat menuliskan komentar Pada website tersbut, tentu kita perlu menampilkan komentar secara
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Inheritance Mapping
Di dunia java, kita mengenal adanya konsep class interitance/turunan JPA memiliki tiga (3) strategi untuk memetakan inheritance
A single-table-per-class hierarchy strategy : semua atribut dari seluruh entitas yang ada dimasukkan menjadi satu tabel (ini merupakan dafault stategy)
A joined-subclass stategy : pada cara ini, semua class (abstract maupun concrete) dipetakan menjadi tabel masing-masing.
A table-per-concrete-class strategy : pada cara ini, setiap entitas concrete ditekan menjadi tabel sendiri.
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Contoh Kasus Inheritance Strategies
Pada setiap kasus hirarki entitas, pasti ada yang dinamakan entitas ROOT (orang tua)
Entitas root ini dapat mendefinisikan strategi inheritance dengan menggunakan anotasi @inheritance
Apabila anoasi ini tidak digunakan, maka strategy default-lah yang akan digunakan (single table per class)
Entitas CD dan Book, diturunkan dari entitas Item
Entitas item adalah entitas root dan memiliki identifier, yang akan menjadi primary key, yang akan dirutunkan kepada kedua entitas CD dan Book
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Single Table Strategy Item, Book, & CD
Strategi ini adalah default apabila kita tidak menggunakan anotasi
@inheritance, dimana semua entitas yang ada akan dipetakan menjadi SATU TABEL saja.
Tabel yang dihasilkan
Dengan menggunakan strategy single-table, maka semua entitas akan masuk ke dalam satu tabel dengan nama defaultnya adalah nama dari entitas root, yaitu ITEM
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Joined Strategy
Pada strategy ini, setiap entitas akan dipetakan menjadi tabel sendiri-sendiri
Entitas root akan menjadi tabel yang berisikan primary key yang akan digunakan oleh semua tabel turunannya. Selain itu, entitas root ini juga akan mendefinisikan kolom discriminator
Semua subclass turunan akan menjadi tabel tersendiri yang berisikan atribut-atribut yang dimilikinya, plus primary key yang mengacu pada primary key entitas root
Entitas item menggnakan Joined Strategy (CD & Book ‘extends to item’ tidak
berubah)
Note : kolom “DTYPE” adalah kolom discriminator Kita dapat melakukan customizing nama discrimator
http://www.uksw.edu Jl. Diponegoro 52-60 Salatiga - Indonesia 50711
Telp 0298-321212 (hunt); E-mail : [email protected]
Tugas Rumah
Terima Kasih
WebBlog : www.tdvdonny.com
Line/WhatsApp/HP : 0821-5777-4189
Hangouts/Plus Google/E-Mail : [email protected]
YM (Yahoo! Messenger) : [email protected]