Hibernate Java geliştiriciler için geliştirilmiş bir ORM kütüphanesidir. Nesne yönelimli modellere göre veritabanı ile olan ilişkiyi sağlayarak, veritabanı üzerinde yapılan işlemleri kolaylaştırmakla birlikte kurulan yapıyı da sağlamlaştırmaktadır.
Hibernate Java geliştiriciler için geliştirilmiş bir ORM kütüphanesidir. Nesne yönelimli modellere göre veritabanı ile olan ilişkiyi sağlayarak, veritabanı üzerinde yapılan işlemleri kolaylaştırmakla birlikte kurulan yapıyı da sağlamlaştırmaktadır.
Nesneye yönelik yazılım ve ilişkisel veritabanı kullanımı günümüzde oldukça yaygındır. Bu iki gözde modelin belkide en önemli problemi en az onlar kadar yaygın ve dahası önü açık olan kuruluş uygulamaları(enterprise applications) ile birlikte kullanıldıklarında oldukça karışık, yorucu ve zaman alıcı olmalarıdır. Hibernate bir nesne/ilişkisel eşleme (Object/Relational Mapping) aracıdır. Burada nesne/ilişkisel eşleme terimi nesne modelindeki veri tanımlarının ilişkisel veri modeline eşleme (mapping) tekniğini ifade etmektedir.
Hibernate yalnızca Java sınıflarından veritabanı tablolarına veya Java veri tiplerinde SQL veri tiplerine dönüşümü yapmaz. Hibernate veri sorgulama(data query) ve veri çekme(data retriaval) işlemlerini de kullanıcı için sağlar. Bu özellikleriyle Hibernate geliştirme kolaylığı ve zamandan kazanç sağlar. Hibernate kullanımı olmadan tüm adı anılan işlemler için SQL ve JDBC’nin olanaklarından faydalanılarak el ile(manual) veri işleme(data handling) gerçekleştirilmesi zaruri olacaktır.
Hibernate genel anlamda Java sınıflarından veritabanı tablolarına dönüşümü ya da Java veri tiplerinden SQL veri tiplerine dönüşümü gerçekleştirir. Ayrıcı veri sorgulama ve veri çekme işlemlerini de kullanıcı için sağlar. Bu özellikleriyle Hibernate uygulamaların geliştirilme aşamasında çok büyük kolaylık ve zamandan kazanç sağlar. Hibernate kullanmadan JDBC ile veri tabanına erişmek mümkündür. Ancak veri tabanındaki tablo sayısı arttığında buna bağlı olarak tablolar arası ilişkiler de artacaktır. Uygulama büyüdükçe bu ilişkiler çok karmaşık bir hal alabilir. Veritabanı işlemleri için connection açma kapama, ilişkili tablolar için çok karmaşık SQL sorguları yazma, aynı fonksiyon içinde birden fazla connection açmama gibi dikkat etmemiz gereken işler artacaktır. Bu işlemleri yaparken yapacağımız en ufak hata uygulamanın tümünü etkileyecektir. Uygulamamızın mimarisi ne kadar düzgün olursa yapısı da bir o kadar karmaşık olacaktır.
Hibernate, hemen hemen yaygın tüm veritabanı sistemleri ile uyumludur. Bu özelliği ile çok fazla firma tarafından tercih edilmektedir. Aynı zamanda veritabanı bağımlılığını da ortadan kaldırdığı için tercih edilmektedir.
Hibernate verinin kalıcı (persistence) olmasını sağlamak için veritabanına karşılık gelen sınıfları ve bu sınıfların konfigurasyon dosyalarını kullanır. Ayrıca hangi veritabanına nasıl bağlanılacağı bilgilerinin ttulduğu bir XML dosyası da vardır. Sınıflar için kullanılan konfigurasyon dosyalarında hangi sınıfı veritabanındaki hangi tabloya karşılık geldiği bilgileri ile kolon bilgileri tutulur. Sınıflar için kullanılan bu konfigurasyon dosyaları eskiden bir metin dosyasında saklanırken şimdi Annotation lar ile ifade edilmektedir.
Annotation nedir diye soracak olursak bu konuda reflection ve aspect oriented programlama hakkında bilgi sahibi olmamız gerekecektir. Bu iki konuda kendi aralarında başlı başlına kitap olabilecek konulardır.
Session ve SessionFactory
Hibernate teki iki önemli sınıftır bunlar. SessionFactory sınıfları yaratılması masraflı sınıflardır. Ne tür uygulama geliştirirseniz geliştirin mutlaka ama mutlaka birtane SessionFactory sınıfı kullanın. SessionFactory sınıfları masraflı olduğundan uygulama boyunca sadece birtane yaratılacağını garanti edin. Bunun için Singleton Pattern yapısını kullanabilirsiniz.
Session sınıfları üretilmesi kolay, masrafsız ve kolay harcanabilir sınıflardır. Genel olarak masaüstü uygulamalarında her işlem için birtane kullanılırken Web uygulamalarında kullanıcı başına bir tane üretilmesi uygun olduğu söylenir. Fakat bu kural pratikte işe yaramamaktadır. Yani masaüstü uygulamaları için olan kısmı doğru olsada web kısmı için aynısını söylemek mümkün değil. Bin kişinin aktif olarak kullandığı bir sitede her kişiye ayrı Session ve doğal olarak Transaction vermek sisteminizi aşırı derecede yoracaktır.
Genel olarak HibernateUtil.java isminde bir sınıf oluşturup, bu sınıfı Singleton Patter kalıbına göre üretmeliyiz. HibernateUtil sınıfı içerisinde SessionFactory ve Session ile ilgili metodları barındırıyor. Herzaman bir tane üretildiğinden sadece birtane SessionFactory oluşturulmuş oluyor. Fakat ayrıca, hibernate ile veritabanı sunucusu arasındaki problemlerden ek bir özellik daha eklemeliyiz. Yani eğer uygulama SessionFactory sınıfına beş saat boyunca erişmediyse SessionFactory sınıfını tekrardan oluşturmalıyız. Böylelikle veritabanı ile SessionFactory sınıfı arasındaki bağlantı hep güncel tutulur. Bu tabiki de çok dummy bir çözüm. Yeni başlayanlar için uygulaması kolay. Fakat bu tip bir sorunun gerçek çözümü için C3P0 isimli ek bir hibernate kütüphanesi kullanılıyor.
Kısaca: Hibernate Mysql, Mssql, Oracle, Mongodb vs veritabanı sistemi ile uyumlu çalışmakta ve çoğunu desteklemektedir. Herhangi bir veritabanı ile çalışmayı zorunlu tutmamaktadır, bu nedenle geliştirdiğiniz bir sistemde veritabanı sisteminizi değiştirmek isteseniz bu süreç geliştirdiğiniz yazılımı etkilemeyecek. Java geliştiriciler arasında en çok kullanılan ORM’dir.
ORM yapısının kullanılmasının avantajları Hibernate içinde geçerlidir. ORM’nin sağladığı avantajları aşağıda listesi mevcuttur..
– Veritabanınız ile modelleriniz arasındaki bağlantıyı sağlamak için geliştirilmiş en iyi sistemdir.
– Veri ekleme, silme, güncelleme, okuma gibi işlemleri kolaylaştırmaktadır.
– Veri aktarma sürecini yönetmenizi sağlayarak, alabileceğiniz veya çıkabilecek hatalara karşı yönetimi de sağlamaktadır.
– SQL yazmaktan kurtarmaktadır.