Yerli ORM Framework’ü (ORMan)

Öncelikle merhaba.

Görünen o ki, en son yazımın üstünden tam 1 yıl geçmiş. Sebebi bloggin işine bir hevesle girmem ve sonrasında blogging olayının zahmetli, zaman isteyen bir iş olmasını tecrübe etmemle birlikte hevesimin kırılması sanıyorum. Neyse işin acıtasyonunu bir kenara bırakırsak bu yazıda amacım başlıktan da anladığınız üzere yerli yapım bir orm framework’ünü tanıtmak.

Konuya teknoloji üretmiyor, tüketiyoruz klişesiyle girmeyeceğim. Bu laf zaten hemen hemen her ortamda yeteri kadar yapılıyor.  Başlamadan önce “ORM ne olaki?” diyenler için onları şuraya almak istiyorum.

Orman, henüz çok yeni ve kayda değer bir deneysel ORM framework’ü. Github repo sayfasına şuradan gidebilirsiniz. Geliştiricisi Ahmet Alp Balkan. Tanıdığıma memnun olduğum yetenekli bilgisayar mühendisliği öğrencisi. Benim de Orman ile tanışmam Ahmet Alp’i Friendfeed’de takip ederken böyle bir çalışma yaptığını görmemle oldu. O zamanlar yanlışım yoksa proje Google Code üzerinde host ediliyordu ve Subversion kullanıyordu. O zamanlar zaten aklımdan geçiyordu böyle bir projeye katkıda bulunmak ancak kıçımı kaldırıp da subversion kasmaya zamanım pek olmadığından kaldı öyle. Sonra birgün Ahmet’in projeyi github’a kaydırdığını gördüm. Ben de zaten git ve github kullandığımdan tam aradığım ortam oluştu. Önce şurası şöyle olsa daha güzel olur dediğim yerlerin implementasyonunu yapıp ilk pull request’imi yaptım. Request’in merge edilmesiyle Orman contributor’lüğüm başlamış oldu. Şuan ben de dahil 3 kişilik geliştirme ekibi mevcut. İsterseniz siz de projeye katkıda bulunabilirsiniz. Misal şu zamanlarda bir test developer hiç fena olmaz :)

Orman yeni olmasına karşın oldukça güçlü bir framework.

  • MySQL, SQLite ve Android aygıtlar için SQLite desteği mevut
  • Oldukça küçük
  • XML gibi dosyalarla ayar yapma vs ek işlem gerektirmez.
  • OneToOne, OneToMany, ManyToOne, ManyToMany relationship destekliyor
  • SQL:1999 uyumlu
  • Kullanımı kolay
  • Hiçbir ek işlem gerektirmeden entity olarak belirlenen model sınıflarını tanımlama
  • Ve daha fazlası için https://github.com/ahmetalpbalkan/orman/wiki

İşin hikaye kısmı bittiğine göre nasıl kullanılır, neye benzer konusunda örneklendirme de yapalım.
Not: Aşağıdaki örnekler Orman Github Wiki sayfasından alınmıştır. 

Örneğin bir Student sınıfımız olduğunu düşünelim. Normal olarak Java sınıf modeli şöyle bir şey olsun.

class Student {
public int id;
public String name;
public Date registrationDate;
public float gpa;
}

Bunu Orman ile kullanmak istediğimizde en temel şekliyle şu hale getiriyoruz.

@Entity
class Student extends Model{
public int id;
public String name;
public Date registrationDate;
public float gpa;
}

Şimdi sınıf üzerinde yapılan iki değişikliği açıklayım. Evvela Student sınıfının Orman için bir entity model olduğunu belirtmek için Entity annotation’ı ile işaretlememiz gerekiyor. Böylelikle Orman sınıfın bir entity olduğunu anlayacak ve register edecek. Diğer farklılık ise Student sınıfımızı Model generic sınıfından extend edilmesi. Bu işlem ise model sınıfını insert, update, delete  ve bir dizi public ve internal  işlemlere hazır hale getirecek. 

Eğer model sınıfımızdaki üye değişkenler (field) public dışında olacaksa mutlaka ilgili field’lara ait getter ve setter metodlarının implementasyonları yapılmalıdır. Bu işlemleri yaparken şu kurallara dikkat etmelisiniz

  1. Getter ve Setter getFieldName, setFieldName şeklinde olmalıdır.
  2. Boolean tipler için getFieldName dışında isFieldName şeklinde de yazılabilir
  3. Setter mutlaka tek argüman almalı ve bu argüman mutlaka field tipinden olmalıdır.
  4. İsterseniz getter ve setter’lar field adı ile aynı olabilir.

Şimdi bu kurala göre Student sınıfımızın gpa field’ını bu kurala göre düzenledim. Düzenlemeden sınıfımız şu şekle dönüşecek

@Entity
class Student extends Model{
public int id;
public String name;
public Date registrationDate;
private float gpa;

public float getGpa() {
return this.gpa;
}

public void setGpa(float g) {
this.gpa = g;
}
}

Bazen model sınıfımızda kullandığımız ancak fiziksel olarak veritabanına yansımasını istemediğimiz field’lar olabilir. Bu durumda ilgili field’ı transient veya volatile ile işaretlememiz gerekir. Orman, bu şekilde işaretlenmiş field’lara dokunmayacaktır.

Orman aksini belirtmediğiniz sürece fiziksel tablo ve alan isimlendirmelerini default policy’si ile isimlendirecektir. Ancak bu isimlendirmeleri siz de belirleyebilirsiniz. Bunu Entity annotation içinde bir attribute (nitelik) vererek yapabilirsiniz. Örneğin Student tablomuz için

@Entity(table = "MyStudents")

Bu durumda varsayılan isimlendirme override edilebilir.
Yine aynı şekilde field için bunu yapabilirsiniz. Bu işlemi de field üzerine verilecek Column annotation ile yapabilirsiniz. Örneğin;

@Column(name = "gpaStr", type = "VARCHAR(4)")
public float gpa;

Bu durumda ilgili field sizin verdiğiniz tip ile map edilecektir.  Burada unutmamanız gereken nokta bu işlem Orman’ın işleyişini override ettiği için yanlış verdiğiniz tip işlemin başarısızlıkla sonuçlanmasına sebep olabilir.
Eğer field not-nullable olacak ise bunu field öncesine @NotNull annotation’ı vererek işaretleyebilirsiniz. Primary Key ve Auto Increment edilecek fieldlarda ise
PrimaryKey annotation’ını kullanabilirsiniz. Eğer bu field auto increment edilecekse “autoIncrement” attribute’unu true olarak set etmelisiniz.

@PrimaryKey(autoIncrement = true)

gibi.  Ayrıca Orman entity’lerinize Index atamanıza da olanak tanır. Eğer bir field’a index atamak istiyorsanız ve Index annotation’ını kullanmalısınız. Bu annotation’a attribute vermediğiniz sürece isimlendirme ve tipini Orman kendisi otomatik olarak belirleyecektir. Ancak isim ve tipi;
@Index(name = "name_index", type = IndexType.BTREE)
public String name;
 

şeklinde belirtebilirsiniz. Index tipi BTREE veya HASH olabilir. Default olarak index tipi BTREE’dir.  

Evet. Genel anlamda Orman içinde bir entity nasıl ve ne şekilde durur görmüş olduk sanıyorum. Bu yazı Orman Framework’ü tanıtmak amaçlıydı. O yüzden daha detaylı kullanımına bu yazıda girmicem. Orman framework nasıl kullanılır konusunda ayrıca bir yazı yazmayı planlıyorum. Zaten bu sizi kesmedi ise sizi Orman Wiki sayfasına alalım. Bu arada neden orman’ı tercih edelim ki diyebilirsiniz. Bu konuda wiki üzerinde güzel bir karşılaştırma da mevcut. Ama özet geçmem gerekirse. Orman küçük ve orta ölçekli işlerinizde ORM rahatlığını  enterprise ürünler kullanarak gereksiz kaynak harcamak yerine tam size göre küçük, kolay ve hızlı bir çözüm sunuyor. Eminim ki ilerleyen zamanlarda çok daha güzel özellikleriyle zaman içinde adını duyuran bir proje olarak karşınıza çıkacak. Sonuçta kimi bazı büyük projeler böyle ufak adımlarla başlamıyor mu? 

Aklımda Orman için birçok feature mevcut. Misal bunlardan bir tanesi tıpkı .NET Entity Framework’de olduğu gibi var olan database’den Java model sınıflarını çıkaran bir proje veya eklenti diyebiliriz. Bununla ilişkili bir tane daha var. Hangisi ağır basarsa o yönde ilerletmeyi düşünüyorum.

Son olarak söyleyeceğim, en azından Orman denemeye değer faydalı, mimarisi düzgün bir framework.  O açıdan desteklenmesi ve gelişimine katkıda bulunulması gerekiyor. 

Benden şimdilik bu kadar.   

Leave a Reply

Your email address will not be published.