{"id":84,"date":"2011-08-30T21:29:02","date_gmt":"2011-08-30T21:29:02","guid":{"rendered":"http:\/\/oguzkartal.net\/blog\/?p=84"},"modified":"2021-10-31T16:05:13","modified_gmt":"2021-10-31T13:05:13","slug":"yerli-orm-frameworku-orman","status":"publish","type":"post","link":"https:\/\/www.oguzkartal.net\/blog\/index.php\/2011\/08\/30\/yerli-orm-frameworku-orman\/","title":{"rendered":"Yerli ORM Framework&#8217;\u00fc (ORMan)"},"content":{"rendered":"<p>\u00d6ncelikle merhaba.<\/p>\n<p>G\u00f6r\u00fcnen o ki, en son yaz\u0131m\u0131n \u00fcst\u00fcnden tam 1 y\u0131l ge\u00e7mi\u015f. Sebebi bloggin i\u015fine bir hevesle girmem ve sonras\u0131nda blogging olay\u0131n\u0131n zahmetli, zaman isteyen bir i\u015f olmas\u0131n\u0131 tecr\u00fcbe etmemle birlikte hevesimin k\u0131r\u0131lmas\u0131 san\u0131yorum. Neyse i\u015fin ac\u0131tasyonunu bir kenara b\u0131rak\u0131rsak bu yaz\u0131da amac\u0131m ba\u015fl\u0131ktan da anlad\u0131\u011f\u0131n\u0131z \u00fczere yerli yap\u0131m bir orm framework&#8217;\u00fcn\u00fc tan\u0131tmak.<\/p>\n<p>Konuya teknoloji \u00fcretmiyor, t\u00fcketiyoruz kli\u015fesiyle girmeyece\u011fim. Bu laf zaten hemen hemen her ortamda yeteri kadar yap\u0131l\u0131yor. &nbsp;Ba\u015flamadan \u00f6nce &#8220;ORM ne olaki?&#8221; diyenler i\u00e7in onlar\u0131 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=ORM+nedir\" target=\"_blank\" rel=\"noopener\">\u015furaya<\/a> almak istiyorum.<\/p>\n<p>Orman, hen\u00fcz \u00e7ok yeni ve kayda de\u011fer bir deneysel ORM framework&#8217;\u00fc. Github repo sayfas\u0131na <a href=\"https:\/\/github.com\/ahmetalpbalkan\/orman\" target=\"_blank\" rel=\"noopener\">\u015furadan<\/a> gidebilirsiniz. Geli\u015ftiricisi <a href=\"http:\/\/ahmetalpbalkan.com\/\" target=\"_blank\" rel=\"noopener\">Ahmet Alp Balkan<\/a>. Tan\u0131d\u0131\u011f\u0131ma memnun oldu\u011fum yetenekli bilgisayar m\u00fchendisli\u011fi \u00f6\u011frencisi. Benim de Orman ile tan\u0131\u015fmam Ahmet Alp&#8217;i Friendfeed&#8217;de takip ederken b\u00f6yle bir \u00e7al\u0131\u015fma yapt\u0131\u011f\u0131n\u0131 g\u00f6rmemle oldu. O zamanlar yanl\u0131\u015f\u0131m yoksa proje Google Code \u00fczerinde host ediliyordu ve Subversion kullan\u0131yordu. O zamanlar zaten akl\u0131mdan ge\u00e7iyordu b\u00f6yle bir projeye katk\u0131da bulunmak ancak k\u0131\u00e7\u0131m\u0131 kald\u0131r\u0131p da subversion kasmaya zaman\u0131m pek olmad\u0131\u011f\u0131ndan kald\u0131 \u00f6yle. Sonra birg\u00fcn Ahmet&#8217;in projeyi github&#8217;a kayd\u0131rd\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fcm. Ben de zaten git ve github kulland\u0131\u011f\u0131mdan tam arad\u0131\u011f\u0131m ortam olu\u015ftu. \u00d6nce \u015furas\u0131 \u015f\u00f6yle olsa daha g\u00fczel olur dedi\u011fim yerlerin implementasyonunu yap\u0131p ilk pull request&#8217;imi yapt\u0131m. Request&#8217;in merge edilmesiyle Orman contributor&#8217;l\u00fc\u011f\u00fcm ba\u015flam\u0131\u015f oldu. \u015euan ben de dahil 3 ki\u015filik geli\u015ftirme ekibi mevcut. \u0130sterseniz siz de projeye katk\u0131da bulunabilirsiniz. Misal \u015fu zamanlarda bir test developer hi\u00e7 fena olmaz :)<\/p>\n<p>Orman yeni olmas\u0131na kar\u015f\u0131n olduk\u00e7a g\u00fc\u00e7l\u00fc bir framework.<\/p>\n<ul>\n<li>MySQL, SQLite ve Android ayg\u0131tlar i\u00e7in SQLite deste\u011fi mevut<\/li>\n<li>Olduk\u00e7a k\u00fc\u00e7\u00fck<\/li>\n<li>XML gibi dosyalarla ayar yapma vs ek i\u015flem gerektirmez.<\/li>\n<li>OneToOne, OneToMany, ManyToOne, ManyToMany relationship destekliyor<\/li>\n<li>SQL:1999 uyumlu<\/li>\n<li>Kullan\u0131m\u0131 kolay<\/li>\n<li>Hi\u00e7bir ek i\u015flem gerektirmeden entity olarak belirlenen model s\u0131n\u0131flar\u0131n\u0131 tan\u0131mlama<\/li>\n<li>Ve daha fazlas\u0131 i\u00e7in&nbsp;<a href=\"https:\/\/github.com\/ahmetalpbalkan\/orman\/wiki\">https:\/\/github.com\/ahmetalpbalkan\/orman\/wiki <\/a><\/li>\n<\/ul>\n<p>\u0130\u015fin hikaye k\u0131sm\u0131 bitti\u011fine g\u00f6re nas\u0131l kullan\u0131l\u0131r, neye benzer konusunda \u00f6rneklendirme de yapal\u0131m.<br \/>\n<strong>Not<\/strong>: A\u015fa\u011f\u0131daki \u00f6rnekler Orman Github Wiki sayfas\u0131ndan al\u0131nm\u0131\u015ft\u0131r.&nbsp;<\/p>\n<p>\u00d6rne\u011fin bir Student s\u0131n\u0131f\u0131m\u0131z oldu\u011funu d\u00fc\u015f\u00fcnelim. Normal olarak Java s\u0131n\u0131f modeli \u015f\u00f6yle bir \u015fey olsun.<\/p>\n<p><code lang=\"java[notools]\">class Student {<br \/>\n    public int id;<br \/>\n    public String name;<br \/>\n    public Date registrationDate;<br \/>\n    public float gpa;<br \/>\n}<\/code><\/p>\n<p>Bunu Orman ile kullanmak istedi\u011fimizde en temel \u015fekliyle \u015fu hale getiriyoruz.<\/p>\n<p><code lang=\"java[notools]\">@Entity<br \/>\nclass Student extends Model<Student>{<br \/>\n    public int id;<br \/>\n    public String name;<br \/>\n    public Date registrationDate;<br \/>\n    public float gpa;<br \/>\n}<\/code><\/p>\n<p>\u015eimdi s\u0131n\u0131f \u00fczerinde yap\u0131lan iki de\u011fi\u015fikli\u011fi a\u00e7\u0131klay\u0131m. Evvela Student s\u0131n\u0131f\u0131n\u0131n Orman i\u00e7in bir entity model oldu\u011funu belirtmek i\u00e7in Entity annotation&#8217;\u0131 ile i\u015faretlememiz gerekiyor. B\u00f6ylelikle Orman s\u0131n\u0131f\u0131n bir entity oldu\u011funu anlayacak ve register edecek. Di\u011fer farkl\u0131l\u0131k ise Student s\u0131n\u0131f\u0131m\u0131z\u0131 Model<t><t> generic s\u0131n\u0131f\u0131ndan extend edilmesi. Bu i\u015flem ise model s\u0131n\u0131f\u0131n\u0131 insert, update, delete &nbsp;ve bir dizi public ve internal &nbsp;i\u015flemlere haz\u0131r hale getirecek.&nbsp;<\/t><\/t><\/p>\n<p>E\u011fer model s\u0131n\u0131f\u0131m\u0131zdaki \u00fcye de\u011fi\u015fkenler (field) public d\u0131\u015f\u0131nda olacaksa mutlaka ilgili field&#8217;lara ait getter ve setter metodlar\u0131n\u0131n implementasyonlar\u0131 yap\u0131lmal\u0131d\u0131r. Bu i\u015flemleri yaparken \u015fu kurallara dikkat etmelisiniz<\/p>\n<ol>\n<li>Getter ve Setter getFieldName, setFieldName \u015feklinde olmal\u0131d\u0131r.<\/li>\n<li>Boolean tipler i\u00e7in getFieldName d\u0131\u015f\u0131nda isFieldName \u015feklinde de yaz\u0131labilir<\/li>\n<li>Setter mutlaka tek arg\u00fcman almal\u0131 ve bu arg\u00fcman mutlaka field tipinden olmal\u0131d\u0131r.<\/li>\n<li>\u0130sterseniz getter ve setter&#8217;lar field ad\u0131 ile ayn\u0131 olabilir.<\/li>\n<\/ol>\n<p>\u015eimdi bu kurala g\u00f6re Student s\u0131n\u0131f\u0131m\u0131z\u0131n gpa field&#8217;\u0131n\u0131 bu kurala g\u00f6re d\u00fczenledim. D\u00fczenlemeden s\u0131n\u0131f\u0131m\u0131z \u015fu \u015fekle d\u00f6n\u00fc\u015fecek<\/p>\n<p><code lang=\"java[notools]\">@Entity<br \/>\nclass Student extends Model<Student>{<br \/>\n    public int id;<br \/>\n    public String name;<br \/>\n    public Date registrationDate;<br \/>\n    private float gpa;<\/p>\n<p>    public float getGpa() {<br \/>\n        return this.gpa;<br \/>\n    }<\/p>\n<p>    public void setGpa(float g) {<br \/>\n        this.gpa = g;<br \/>\n    }<br \/>\n}<\/code><\/p>\n<p>Bazen model s\u0131n\u0131f\u0131m\u0131zda kulland\u0131\u011f\u0131m\u0131z ancak fiziksel olarak veritaban\u0131na yans\u0131mas\u0131n\u0131 istemedi\u011fimiz field&#8217;lar olabilir. Bu durumda ilgili field&#8217;\u0131 <strong>transient <\/strong>veya <strong>volatile&nbsp;<\/strong>ile i\u015faretlememiz gerekir. Orman, bu \u015fekilde i\u015faretlenmi\u015f field&#8217;lara dokunmayacakt\u0131r.<\/p>\n<p>Orman aksini belirtmedi\u011finiz s\u00fcrece fiziksel tablo ve alan isimlendirmelerini default policy&#8217;si ile isimlendirecektir. Ancak bu isimlendirmeleri siz de belirleyebilirsiniz. Bunu Entity annotation i\u00e7inde bir attribute (nitelik) vererek yapabilirsiniz. \u00d6rne\u011fin Student tablomuz i\u00e7in<\/p>\n<p><code lang=\"java[notools]\">@Entity(table = \"MyStudents\")<\/code><\/p>\n<p>Bu durumda varsay\u0131lan isimlendirme override edilebilir.<br \/>\nYine ayn\u0131 \u015fekilde field i\u00e7in bunu yapabilirsiniz. Bu i\u015flemi de field \u00fczerine verilecek Column annotation ile yapabilirsiniz. \u00d6rne\u011fin;<\/p>\n<p><code lang=\"java[notools]\">@Column(name = \"gpaStr\", type = \"VARCHAR(4)\")<br \/>\npublic float gpa;<br \/>\n<\/code><br \/>\nBu durumda ilgili field sizin verdi\u011finiz tip ile map edilecektir. &nbsp;Burada unutmaman\u0131z gereken nokta bu i\u015flem Orman&#8217;\u0131n i\u015fleyi\u015fini override etti\u011fi i\u00e7in yanl\u0131\u015f verdi\u011finiz tip i\u015flemin ba\u015far\u0131s\u0131zl\u0131kla sonu\u00e7lanmas\u0131na sebep olabilir.<br \/>\nE\u011fer field not-nullable olacak ise bunu field \u00f6ncesine @NotNull annotation&#8217;\u0131 vererek i\u015faretleyebilirsiniz. Primary Key ve Auto Increment edilecek fieldlarda ise<br \/>\nPrimaryKey annotation&#8217;\u0131n\u0131 kullanabilirsiniz. E\u011fer bu field auto increment edilecekse &#8220;autoIncrement&#8221; attribute&#8217;unu true olarak set etmelisiniz.<\/p>\n<p><code lang=\"java[notools]\">@PrimaryKey(autoIncrement = true)<\/code><\/p>\n<p>gibi. &nbsp;Ayr\u0131ca Orman entity&#8217;lerinize Index ataman\u0131za da olanak tan\u0131r. E\u011fer bir field&#8217;a index atamak istiyorsan\u0131z ve Index annotation&#8217;\u0131n\u0131 kullanmal\u0131s\u0131n\u0131z. Bu annotation&#8217;a attribute vermedi\u011finiz s\u00fcrece isimlendirme ve tipini Orman kendisi otomatik olarak belirleyecektir. Ancak isim ve tipi;<br \/>\n<span style=\"font-family: monospace; font-size: 12px; line-height: 18px; white-space: pre;\"> <\/span><code lang=\"java[notools]\">@Index(name = \"name_index\", type = IndexType.BTREE)<br \/>\npublic String name;<\/code><span style=\"font-family: monospace; font-size: 12px; line-height: 18px; white-space: pre;\">&nbsp;<\/span><\/p>\n<p>\u015feklinde belirtebilirsiniz. Index tipi BTREE veya HASH olabilir. Default olarak index tipi BTREE&#8217;dir. &nbsp;<\/p>\n<p>Evet. Genel anlamda Orman i\u00e7inde bir entity nas\u0131l ve ne \u015fekilde durur g\u00f6rm\u00fc\u015f olduk san\u0131yorum. Bu yaz\u0131 Orman Framework&#8217;\u00fc tan\u0131tmak ama\u00e7l\u0131yd\u0131. O y\u00fczden daha detayl\u0131 kullan\u0131m\u0131na bu yaz\u0131da girmicem. Orman framework nas\u0131l kullan\u0131l\u0131r konusunda ayr\u0131ca bir yaz\u0131 yazmay\u0131 planl\u0131yorum. Zaten bu sizi kesmedi ise sizi <a href=\"https:\/\/github.com\/ahmetalpbalkan\/orman\/wiki\" target=\"_blank\" rel=\"noopener\">Orman Wiki<\/a> sayfas\u0131na alal\u0131m. Bu arada neden orman&#8217;\u0131 tercih edelim ki diyebilirsiniz. Bu konuda wiki \u00fczerinde g\u00fczel bir <a href=\"https:\/\/github.com\/ahmetalpbalkan\/orman\/wiki\/Why-orman-is-better-than-other-orms-for-you%3F\" target=\"_blank\" rel=\"noopener\">kar\u015f\u0131la\u015ft\u0131rma<\/a> da mevcut. Ama \u00f6zet ge\u00e7mem gerekirse. Orman k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli i\u015flerinizde ORM rahatl\u0131\u011f\u0131n\u0131 &nbsp;enterprise \u00fcr\u00fcnler kullanarak gereksiz kaynak harcamak yerine tam size g\u00f6re k\u00fc\u00e7\u00fck, kolay ve h\u0131zl\u0131 bir \u00e7\u00f6z\u00fcm sunuyor. Eminim ki ilerleyen zamanlarda \u00e7ok daha g\u00fczel \u00f6zellikleriyle zaman i\u00e7inde ad\u0131n\u0131 duyuran bir proje olarak kar\u015f\u0131n\u0131za \u00e7\u0131kacak. Sonu\u00e7ta kimi baz\u0131 b\u00fcy\u00fck projeler b\u00f6yle ufak ad\u0131mlarla ba\u015flam\u0131yor mu?&nbsp;<\/p>\n<p>Akl\u0131mda Orman i\u00e7in bir\u00e7ok feature mevcut. Misal bunlardan bir tanesi t\u0131pk\u0131 .NET Entity Framework&#8217;de oldu\u011fu gibi var olan database&#8217;den Java model s\u0131n\u0131flar\u0131n\u0131 \u00e7\u0131karan bir proje veya eklenti diyebiliriz. Bununla ili\u015fkili bir tane daha var. Hangisi a\u011f\u0131r basarsa o y\u00f6nde ilerletmeyi d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<p>Son olarak s\u00f6yleyece\u011fim, en az\u0131ndan Orman denemeye de\u011fer faydal\u0131, mimarisi d\u00fczg\u00fcn bir framework. &nbsp;O a\u00e7\u0131dan desteklenmesi ve geli\u015fimine katk\u0131da bulunulmas\u0131 gerekiyor.&nbsp;<\/p>\n<p>Benden \u015fimdilik bu kadar. &nbsp;&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00d6ncelikle merhaba. G\u00f6r\u00fcnen o ki, en son yaz\u0131m\u0131n \u00fcst\u00fcnden tam 1 y\u0131l ge\u00e7mi\u015f. Sebebi bloggin i\u015fine bir hevesle girmem ve sonras\u0131nda blogging olay\u0131n\u0131n zahmetli, zaman isteyen bir i\u015f olmas\u0131n\u0131 tecr\u00fcbe etmemle birlikte hevesimin k\u0131r\u0131lmas\u0131 san\u0131yorum. Neyse i\u015fin ac\u0131tasyonunu bir kenara b\u0131rak\u0131rsak bu yaz\u0131da amac\u0131m ba\u015fl\u0131ktan da anlad\u0131\u011f\u0131n\u0131z \u00fczere yerli yap\u0131m bir orm framework&#8217;\u00fcn\u00fc tan\u0131tmak. Konuya&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"twitterCardType":"","cardImageID":0,"cardImage":"","cardTitle":"","cardDesc":"","cardImageAlt":"","cardPlayer":"","cardPlayerWidth":0,"cardPlayerHeight":0,"cardPlayerStream":"","cardPlayerCodec":"","footnotes":""},"categories":[35],"tags":[41,37,40,36,38,39],"class_list":["post-84","post","type-post","status-publish","format-standard","hentry","category-databases","tag-database","tag-framework","tag-object-relational-mapping","tag-orm","tag-orman","tag-sql"],"_links":{"self":[{"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/posts\/84","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=84"}],"version-history":[{"count":24,"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/posts\/84\/revisions"}],"predecessor-version":[{"id":922,"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/posts\/84\/revisions\/922"}],"wp:attachment":[{"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=84"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=84"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oguzkartal.net\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=84"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}