ORM , ( Object to Relational Mapping ) Nesne ile İlişkisel Eşleme olarak açabiliriz. ORM ilişkisel veri tabanı ile uygulamamız arasında bir köprü görevi gören, ilişkileri ve nesneleri yönetmek için kullanılan bir tekniktir.
- Database teknolojisine olan bağımlılığını ortadan kaldırır. Uygulama sadece ORM'i bilir. Database hakkında fikri yoktur.
- SQL/TSQL/PLSQL bilmeden çok kısa bir zamanda db işlemlerini çok daha az kod yazarak yapabilirsiniz.
- Nesne yönelimli kod yazmayı destekler.
- ORM Araçlarının çoğu açık kaynak kodludur.
- Performans sorunları yaratabilir. DB'ye bağlanıp sql çalıştırmak her zaman için daha performanslıdır.
- Orm araçlarının oluşturduğu sql lere müdahale edemezsiniz. Kontrolü developer'dan alır.
- Orm aracını öğrenmek için de zamana ihtiyacınız vardır.
- DB First Yaklaşım
- Code First Yaklaşım
- Model First Yaklaşım
Database First yaklaşımda var olan bir veri tabanından modeli .EDMX uzantılı dosya olarak oluşturur. Bu yaklaşımda veri tabanında değişiklikler yapmak istendiğinde, SQL server da manuel olarak değişiklikler yapıldıktan sonra modele aktarılır.
Code First, kod ile veri tabanı ve entity modeli oluşturma yaklaşımıdır. Öncelikle entity classları oluşturulur, classlar arası ilişkiler belirlenir. Daha sonra classlar tablo olarak, classlardaki propertyler ise kolon olarak veri tabanına aktarılır. Code First yaklaşımında EDMX desing yapılmaz.
Model First yaklaşımında önce yeni bir model oluşturmaya daha sonra o modelden bir veri tabanı şeması oluşturmaya izin verir. Model bir .EDMX dosyasında saklanır. Bu yaklaşımda entity’leri, ilişkileri vb. EDMX design da oluşturmalı ve daha sonra modelden veri tabanı oluşturulmalıdır.
Hibernate javageliş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 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.
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 tutulduğ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ırke şimdi Annotation lar ile ifade edilmektedir.
Kodlarımız da HQL yazıyoruz yani Hibernate Query Language nesneye yönelik sorgulama dilidir. Bu sorgulama dilinin avantajı nesnesel olması ve bizim java sınıflarımız ile ilişkili bir yapı kurabilmemizi mümkün kılmaktadır. “Code first” yapısına daha uygun olan HQL bizi sadece koda odaklanmamızı da sağlıyor. Sorgulama işlemlerimizi SQL’de olduğu gibi tablolar ve alanları üzerinden değil java sınfları ve sınıflar üzerinde oluşturduğumuz değişkenler üzerinden yapılmasına olanak sağlamaktadır.
Maven-Hibernate ile veritabanı işlemi yapabilmemiz için belli başlı bağımlılıklar ve hibernate xml dosyasına ihtiyacımız bu dosyayı main altında resources kısmına ekliyoruz. Bu hibernate.cfg.xml dosayasını inceleyecek olursak mysql bağlantısı yapabileceğimiz bir driver,url,username,password gibi bilgieri girerek mysql bağlantısını oluşturuyoruz.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=Turkey</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">****</property>
<property name="hibernate.connection.pool_size">1</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
Bunlar tek başına yeterli olmayacaktır hibernate ve mysql'i görebilmesi için bağımlıkık eklememiz gerekiyor
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.14.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>