Sabtu, 30 Januari 2010

Belajar Grails (bagian keempat)

Membuat kelas Domain


Sekarang mari kita bahas kelas Domain yang telah kita buat pada pembahasan sebelumnya. Kode yang kita buat seperti tampak di bawah ini:



Listing 4.1


class DaftarTeman {
    String nama
    String alamat
    String nomorHP
    String nomorTelpon
    Date tanggalLahir

    static constraints = {
        nama(size:0..40, nullable: false)
        alamat(size:0..80, nullable: true)
        nomorHP(size:0..20, nullable: true)
        nomorTelpon(size:0..20, nullable: true)
        tanggalLahir()
    }
    
    String toString() {
        "$nama"
    }
}

  • baris 01


    nama kelas yang akan menjadi nama tabel di database.
  • baris 02 - 06


    nama-nama field dan tipe datanya.
  • baris 09 - 13


    digunakan untuk validasi dan menentukan atribut dari field di database.
  • baris 16 - 18


    method yang akan mengembalikan nilai string.

Tipe Data


Tipe data yang akan digunakan untuk membuat sebuah domain adalah tipe data yang di dukung oleh Groovy (jika anda tidak sempat mempelajari Groovy, asumsikan saja tipe data yang akan dipergunakan dengan tipe data yang biasa anda gunakan pada pemrograman Java). Seperti terlihat pada potongan kode diatas. Jika anda berasumsi bahwa Groovy adalah sebuah perluasan bahasa Java, maka asumsi itu tidak seluruhnya salah. Untuk mudahnya, asumsi diatas dapat di terima. Sebaiknya anda pelajari Groovy lebih mendalam untuk mengetahui lebih dalam bahasa yang dipergunakan oleh Grails.


Constraint


Constraint digunakan untuk beberapa hal. Diantaranya adalah membuat validasi pada data yang akan di masukkan oleh pengguna, juga digunakan oleh Grails untuk mendefinisikan field-field pada tabel di database yang akan dibuat dan digunakan nantinya.


Di bawah ini akan di tampilkan tabel macam-macam constraint yang di dukung oleh Grails.


Constraint Contoh Keterangan
blank login(blank:false) Set ke false jika nilai string tidak boleh kosong
email email(email:true) Set ke true jika nilai harus berupa alamat email
inList login(inList:["Joe", "Fred"] ) Nilai yang dimasukkan harus sesuai dengan nilai di dalam list
length login(length:5..15) Digunakan untuk membatasi panjang dari string atau array
min age(min:new Date()) Untuk menentukan nilai minimum
minLength login(minLength:5) Untuk menentukan panjang minimum string atau array
minSize children(minSize:5) Untuk menentukan ukuran minimum collection atau angka
matches login(matches:/[a-zA-Z]/) Untuk diperiksa apakah sesuai dengan regular expression yang di berikan
max age(max:new Date()) Untuk menentukan nilai maksimum
maxLength login(maxLength:5) Untuk menentukan panjang maksimum string atau array
maxSize children(maxSize:25) Untuk menentukan panjang maksimum collection atau angka
notEqual login(notEqual:"Bob") Nilai yang dimasukkan tidak boleh sama dengan nilai yang ditentukan
nullable age(nullable:false) Set ke false jika nilai tidak boleh berupa null
range age(range:minAge..maxAge) Nilai yang dimasukkan harus berada dalam range yang ditentukan
size children(size:5..15) Untuk membatasi ukuran dari collection atau angka sesuai range yang ditentukan
unique login(unique:true) Set ke true jika properti harus unik
url url(url:true) Set ke true jika nilai string adalah alamat URL

Relasi antar Tabel


Grails (via GORM -> Grails Object-Relational Mapping) menyediakan beberapa cara dalam mendefinisikan relasi antar tabel. Misalnya kita mempunyai dua buah tabel yang akan di buat relasi antar tabel seperti tampak pada tabel di bawah ini:


Pengarang Buku
namaPengarang judulBuku

Dan kode untuk kelas domain yang kita buat tampak seperti berikut:



Listing 4.2


class Pengarang {
   String namaPengarang

   static constraints = {
       namaPengarang(size:0..40, nullable: false)
   }
    
   String toString() {
       "$namaPengarang"
   }
}


class Buku {
   String judulBuku

   static constraints = {
       judulBuku(size:0..40, nullable: false)
   }
    
   String toString() {
       "$judulBuku"
   }
}

  • Relasi one-to-one

    • Satu arah (Unidirectional)


      Kita ingin menambahkan relasi dimana setiap buku punya seorang pengarang. Maka kode yang akan kita buat menjadi seperti dibawah ini:



      Listing 4.3


      class Pengarang {
         String namaPengarang
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         String judulBuku
         Pengarang pengarang
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
         
         String toString() {
             "$judulBuku"
         }
      }
      

    • Dua arah (Bi Directional)


      Jika kita ingin membuat relasi dimana seorang pengarang juga mempunyai buku, maka kode yang dibuat menjadi seperti dibawah ini:



      Listing 4.4


      class Pengarang {
         String namaPengarang
         Buku buku
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         String judulBuku
         Pengarang pengarang
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }
      




      Jika anda menginginkan relasi antar tabel saling mempengaruhi pada saat insert/update ke database maka kode yang dibuat menjadi:



      Listing 4.5


      class Pengarang {
         String namaPengarang
         Buku buku
      
         static constraints = {
           namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         static belongsTo = [pengarang:Pengarang]
         String judulBuku
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }
      

      Kata kunci belongsTo pada kode diatas menunjukkan bahwa tabel Buku dimiliki oleh tabel Pengarang. Namun harap di perhatikan, jika anda menghapus satu data Pengarang maka Buku yang berkaitan juga ikut dihapus dari database.

  • Relasi one-to-many/many-to-one

    • Satu arah (Unidirectional)


      Jika anda ingin membuat sebuah relasi dimana seorang Pengarang mempunyai banyak Buku, maka kode yang dibuat menjadi seperti berikut:



      Listing 4.6


      class Pengarang {
         static hasMany = [buku:Buku]
         String namaPengarang     
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         String judulBuku
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }
      

    • Dua arah (Bi Directional)



      Listing 4.7


      class Pengarang {
         static hasMany = [buku:Buku]
         String namaPengarang
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         static belongsTo = [pengarang:Pengarang]
         String judulBuku
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }
      


2 komentar:

  1. blh neh grails, kebetulan lg belajar, btw bs tanya2 ga tentang grails? hehehe

    BalasHapus
  2. @Aswin: Boleh aja. Tapi mohon maaf sebelumnya, saya mungkin tidak segera menjawab pertanyaan-pertanyaan yang masuk. Soalnya saya tidak selalu online.

    BalasHapus