Hibernate ORM Annotation – Relational Mapping Tutorial Pemrograman Berorientasi Objek Lanjut
Pada tutorial kali ini, kita akan membuat mapping entity class yang memiliki relasi dengan entity lain dengan menggunakan ORM Hibernate Annotation. Ada 4 jenis relasi antara setiap entity, yaitu one-to-one, one-to-many, many-to-one, dan manyto-many. Tutorial ini akan memakai studi kasus database northwind, dengan mengambil table Customers, Orders, Order_details, dan Products.
Setiap relasi yang dimiliki oleh entity class akan disimpan menjadi sebuah collection yang memiliki generic entity relasinya. Misal, hubungan antara table Customers dan Orders adalah one-to-many, satu orang Customers bisa memiliki banyak Orders. Berarti, di dalam entity Customers, kita akan membuat sebuah attribut bertipe Set
, yang menjelaskan hubungan relasi dari Customers ke Orders. Dengan demikian, entity yang harus kita buat adalah sebagai berikut:
Sebaliknya, untuk relasi dari Orders ke Customers dapat diartikan setiap Orders yang ada pasti dimiliki oleh satu Customers. Dengan demikian, untuk entity Orders akan dibuat sebagai berikut:
Relasi antara table Orders dan Products merupakan relasi many-to-many. Dalam konsep database relasional, relasi yang berada di hubungan many-to-many akan ditransformasi menjadi sebuah tabel. Dengan demikian, kita bisa menyederhanakan relasi tersebut menjadi: 1. Satu Orders memiliki banyak Order_details 2. Satu Products memiliki banyak Order_details Maka, berdasarkan penyederhanaan diatas, kita harus membuat 3 buah entity class. a. Entity Orders :
b. Entity Order_details :
c. Entity Products :
Melakukan query join menggunakan HQL Setelah melakukan mapping antara entity yang memiliki relasi, kita bisa melakukan query join antara entity tersebut. Contoh berikut ini merupakan query join yang menghasilkan list product yang dibeli oleh customers “VICTE”. "select p " + "from Products p " + "join p.orderDetails detail " + "join detail.order ord " + "join ord.customer cust " + "where cust.customerID = “VICTE";
Perhatikan alias dan white-space(spasi) yang digunakan pada query diatas. Query diatas akan dieksekusi sebagai berikut, dimana kita akan menampung hasil dari query tersebut menjadi collection list dengan generic bertipe Products karena hasil dari query tersebut merupakan objek-objek bertipe Products. Session session = HibernateUtil.getSessionFactory(); session.openSession(); List products = session.createQuery(myQuery).list();
Contoh berikut ini adalah query yang akan megambil semua Orders yang dimiliki oleh seorang Customers. String myQuery2 = "select ord "
//alias dari Orders adalah ord
+ "from Orders ord " + "where ord.customer.customerID = 'ANTON'";
Perhatikan alias dan white-space (spasi) yang digunakan pada query diatas. Query diatas akan dieksekusi sebagai berikut, dimana kita akan menampung hasil dari query tersebut menjadi collection list dengan generic bertipe Orders karena hasil dari query tersebut merupakan objek-objek bertipe Orders. Session session = HibernateUtil.getSessionFactory(); session.openSession(); List products = session.createQuery(myQuery2).list();
Berikut ini merupakan contoh untuk melakukan insert terhadap seorang Customers yang memiliki dua buah Orders. Customers customer = new Customers(); customer.setCustomerID("SFS"); customer.setCompanyName("Sendy Ferdian Sujadi"); customer.setPhone("123456");
Orders order1 = new Orders(); order1.setShipCountry("Indonesia"); order1.setShipRegion("Bandung"); order1.setCustomer(customer); Orders order2 = new Orders(); order2.setShipCountry("Australia"); order2.setShipRegion("New South Wales"); order2.setCustomer(customer); Set orderCustomer = new HashSet<>(); orderCustomer.add(order1); orderCustomer.add(order2); customer.setOrders(orderCustomer); dao2.saveCustomers(customer); //save customer ke DB dao2.saveOrders(orderCustomer); //save semua order ke DB
Baris yang dicetak tebal dan bergaris bawah mengindikasikan bahwa objek tersebut memiliki relasi terhadap objek lainnya. Sebagai contoh, untuk code order1.setCustomer(customer);, ini menunjukkan bahwa objek order1 merupakan milik dari customer yang bernama Sendy Ferdian Sujadi. Hal tersebut juga
berlaku
untuk
code
customer.setOrders(orderCustomer);,
ini
menunjukkan bahwa, customer Sendy Ferdian Sujadi memiliki 2 buah order yang ditampung sementara di dalam collection Set orderCustomer. Untuk lebih jelas, perhatikan mapping relasi yang sudah dibahas pada bagian sebelumnya.