ORM(Object Relational Mapping) Nedir ?
ORM (Object Relational Mapping), Model sınıflarımız ile database tablolarımızı map etmemizi sağlayan, bir köbrü görevi gören programlama tekniğidir. Büyük projelerde DB tasarlarken her bir tabloyu sorgular ile oluşturmaya çalışırsak günlerce sürebilir. ORM bizim için nesne ile ilişkisel veri tabanını bağlar. Bunların yanında çok kişinin çalıştığı projelerde bir standart ile birlikte herkes aynı dili konuşur ve herkes standarda uymak zorunda kalır.
- C#: Entity Framework, Dapper, ECO, XPO, Norm
- Java: Hibernate, Ebean, Torque, JPA, MyBattis
- Php: CakePHP, Codelgniter, RedBean, Doctrine,Propel, PdoMap
- Python: Django, South,Storm

JPA (Java Persistence API) nedir?
JPA bir standarttır. ORM’in Java’daki standardıdır. Java da birkaç tane standart vardır ancak JPA en çok kullanılanıdır. Java Persistence API herhangi bir java nesnesinin veri tabanındaki ilişkisel bir tabloya eklenebilmesini, o tablodan okunabilmesi gibi çeşitli özellikler sağlar. Hibernate, EclipseLink vs. ORM’ler bir araya gelip bir standart oluştururlar. Bu standarda uyarak özel sorgular yazmadıysak, database fark etmeksizin çalışmasını sağlamış olacağız. Aynı sorgu Oracle, MySQL veya PostgreSQL’de çalışacaktır.

Hibernate nedir?
Hibernate, Java ortamları için bir ORM (Object Relational Mapping) çözümüdür. Hibernate, Java tabanlı bir ORM teknolojisidir. Hibernate, JPA standardından öncede vardır. Hibernate kullanmak için düz hibernate kullanılabilir veya JPA standardı ile de hibernate kullanabiliriz. JPA standardı ile kullanılması en doğrusudur. İleri bir zamanda eğer hibernate değil de eclipseLink vs. kullanılacak denilirse zaten standarda uyduğumuz için bir maliyeti olmayacaktır. Bunların yanında hibernate de JPA standartlarına göre daha fazla özellik bulunmaktadır. Bazı durumlarda düz hibernate kullanmakta mantıklı olabilir. Durum el verdikçe JPA ama yetmediği yerde hibernate kullanılmalıdır.
Buraya kadar yazılanlardan yola çıkarak JPA (Java Persistence Api) ‘ın bir standart, Hibernate’in ise bir JPA uygulaması olduğunu aklımızdan çıkarmayalım.
Spring Data JPA nedir?
Spring Data; Spring kütüphanesinin bir parçasıdır.
- Spring Data sanıldığı aksine Hibernate gibi bir JPA uygulaması değildir.
- Hibernate bir JPA uygulaması iken Spring Data JPA bir veri erişimi soyutlaması yapan bir kütüphanedir.
- Spring Data JPA GenericDao özel uygulamalarına bir çözüm sunar. Metot adı kuralları aracılığıyla sizin adınıza JPA sorguları oluşturabilir.
Her ne kadar SQL sorgusu yazmadan işlerimizi halletse de karışık sorgularda SQL sorgular yazmak zorunda kalabiliriz. Bundan dolayı biz JPA kullanıyoruz SQL bilmemize gerek yok gibi bir düşünce olmasın.
Spring Data ile Hibernate, Eclipse Link gibi herhangi bir JPA uygulamasını beraber kullanabilirsiniz. Dolayısıyla Hibernate ile Spring Data JPA bir rakip değillerdir ve aynı kapsamda değerlendirilemezler aksine birbirlerini tamamlayıcı özellikler taşırlar.
@Repository
public interface ProjectRepository extends JpaRepository<Project,Long> {
Project findByProjectCode(String projectCode);
// Select * from project where project_code = ?
List<Project> findAllByProjectCodeContains(String projectCode);
// Select * from project where project_code like ?
Project findByProjectCodeAndIdNot(String projectCode, Long id);
// Select * from project where project_code = ?
}