Spring Data JPA Nedir? Spring Data JPA, Java Persistence API (JPA) tabanlı veri erişim katmanlarının uygulanmasını kolaylaştıran bir Spring Framework modülüdür. Geliştiricilerin veritabanı işlemlerini daha az kod yazarak gerçekleştirmelerini sağlar.
Repository Kavramı Repository, veri erişim katmanını soyutlayan bir arayüzdür. Spring Data JPA, CRUD (Create, Read, Update, Delete) operasyonları için hazır metodlar sunan
JpaRepository
gibi önceden tanımlanmış repository arayüzleri sağlar.@Entity Anotasyonu JPA entity'lerini işaretlemek için kullanılan bir anotasyondur. Bu anotasyon ile işaretlenen sınıflar, veritabanı tablolarına karşılık gelir.
@Id Anotasyonu Entity sınıfındaki birincil anahtar (primary key) alanını belirtmek için kullanılır. Her entity'nin benzersiz bir kimliği olmalıdır.
@GeneratedValue Anotasyonu Birincil anahtarın otomatik olarak nasıl oluşturulacağını belirtir. Örneğin,
strategy = GenerationType.IDENTITY
ile otomatik artan bir değer kullanılabilir.CrudRepository Arayüzü Temel CRUD işlemleri için metodlar sağlayan bir repository arayüzüdür.
save()
,findById()
,delete()
gibi metodları içerir.JpaRepository Arayüzü
CrudRepository
'den türetilmiş, JPA'ya özgü ek metodlar sağlayan bir arayüzdür. Sayfalama ve sıralama gibi işlevler sunar.Query Metodları Repository arayüzlerinde metod isimlendirme kurallarına göre otomatik olarak sorgu oluşturulan metodlardır. Örneğin,
findByLastName(String lastName)
.@Query Anotasyonu Özel sorgular yazmak için kullanılır. JPQL (Java Persistence Query Language) veya native SQL sorguları tanımlanabilir.
Paging ve Sorting Büyük veri setlerini sayfalara bölmek ve sıralamak için kullanılan özelliklerdir.
Pageable
veSort
parametreleri ile kullanılır.@ManyToOne İlişkisi İki entity arasında çoka-bir ilişkiyi temsil eder. Örneğin, bir öğrencinin bir sınıfa ait olması.
@OneToMany İlişkisi Bire-çok ilişkiyi temsil eder. Örneğin, bir sınıfın birden fazla öğrencisi olması.
@ManyToMany İlişkisi Çoka-çok ilişkiyi temsil eder. Örneğin, öğrencilerin birden fazla kursa kaydolabilmesi ve kursların birden fazla öğrencisi olabilmesi.
Cascade İşlemleri İlişkili entity'ler üzerinde otomatik işlemler gerçekleştirmek için kullanılır. Örneğin, bir entity silindiğinde ilişkili entity'lerin de silinmesi.
FetchType (LAZY ve EAGER) İlişkili entity'lerin ne zaman yükleneceğini belirler. LAZY, ihtiyaç duyulduğunda; EAGER, ana entity ile birlikte yüklenmesini sağlar.
@Transactional Anotasyonu Veritabanı işlemlerinin atomik olarak gerçekleştirilmesini sağlar. Bir metod içindeki tüm işlemlerin ya tamamen başarılı olmasını ya da hiçbirinin gerçekleşmemesini garanti eder.
Auditing Entity'lerin oluşturulma, güncellenme tarihlerini ve kim tarafından yapıldığını otomatik olarak takip etmek için kullanılır.
@CreatedDate
,@LastModifiedDate
gibi anotasyonlar kullanılır.Specification API Karmaşık sorgular oluşturmak için kullanılan bir API'dir. Dinamik olarak sorgu kriterleri oluşturmayı sağlar.
@Modifying Anotasyonu
@Query
anotasyonu ile birlikte kullanılarak UPDATE veya DELETE işlemlerini gerçekleştiren sorguları işaretlemek için kullanılır.Projections Entity'lerin belirli alanlarını seçerek sonuçları özelleştirmek için kullanılır. Performansı artırmak ve veri transferini optimize etmek için faydalıdır.
@Embeddable ve @Embedded Bir entity içinde başka bir nesneyi gömülü olarak kullanmak için kullanılır. Veritabanı normalizasyonunu korurken nesne-yönelimli tasarımı destekler.
Native Queries Veritabanına özgü SQL sorgularını kullanmak için
@Query
anotasyonuyla birliktenativeQuery = true
parametresi kullanılır.Named Queries Sık kullanılan sorguları entity sınıfında veya XML dosyasında tanımlamak için kullanılır.
@NamedQuery
anotasyonu ile işaretlenir.Query By Example (QBE) Örnek bir entity nesnesi kullanarak dinamik sorgular oluşturmayı sağlayan bir tekniktir. Karmaşık filtreleme senaryoları için kullanışlıdır.
Derived Query Methods Method isimlerinden otomatik olarak oluşturulan sorgulardır. Örneğin,
findByEmailAndName(String email, String name)
.@Version Anotasyonu Optimistik kilitleme (optimistic locking) için kullanılır. Eşzamanlı güncellemeleri yönetmeye yardımcı olur.
Inheritance Strategies JPA'da kalıtım ilişkilerini modellemek için kullanılan stratejilerdir. Single Table, Joined Table ve Table Per Class stratejileri mevcuttur.
@NamedEntityGraph İlişkili entity'lerin yüklenmesini özelleştirmek için kullanılır. Performans optimizasyonu için faydalıdır.
Composite Primary Keys Birden fazla alanın birlikte birincil anahtar oluşturduğu durumlar için kullanılır.
@IdClass
veya@EmbeddedId
ile uygulanabilir.Stored Procedure Calls Veritabanında saklı prosedürleri çağırmak için kullanılır.
@Procedure
anotasyonu veya repository metodları ile yapılabilir.Auditing with Spring Data JPA Entity'lerin oluşturulma ve güncellenme zamanlarını otomatik olarak kaydetmek için kullanılır.
@EnableJpaAuditing
ile etkinleştirilir.Custom Repository Implementations Özel repository metodları eklemek için kullanılır. Standart CRUD işlemlerinin ötesinde özelleştirilmiş işlevsellik sağlar.
@DynamicUpdate Sadece değişen alanların güncellenmesini sağlar. Büyük entity'lerde performans artışı sağlayabilir.
Batch Operations Toplu veri işlemleri için kullanılır.
saveAll()
,deleteAll()
gibi metodlar veya özel batch işlemleri uygulanabilir.Criteria API Karmaşık sorguları programatik olarak oluşturmak için kullanılır. Dinamik sorgular için JPA Criteria API'sini kullanır.
Locking Mechanisms Eşzamanlı erişimi yönetmek için kullanılır. Optimistik ve pesimistik kilitleme stratejileri mevcuttur.
@SQLDelete ve @SQLUpdate Özel SQL ifadeleriyle silme ve güncelleme işlemlerini tanımlamak için kullanılır. Soft delete gibi senaryolarda faydalıdır.
@Where Anotasyonu Entity'lere global where koşulları eklemek için kullanılır. Örneğin, silinmemiş kayıtları otomatik olarak filtrelemek için.
Attribute Converters Entity alanlarını veritabanı sütunlarına dönüştürmek ve tersini yapmak için özel mantık uygulamak üzere kullanılır.
Hibernate Envers ile Revision Control Entity'lerdeki değişikliklerin geçmişini tutmak için kullanılır. Her değişiklik için ayrı bir revizyon kaydı oluşturur.
@Modifying ve @Query ile Bulk Updates Toplu güncelleme işlemleri için kullanılır. Tek bir sorgu ile birden fazla kaydı güncellemeye olanak tanır.
First ve Top Keywords Sorgu sonuçlarını sınırlamak için kullanılır. Örneğin,
findFirstByOrderByLastnameAsc()
veyafindTop3ByAge(int age)
.Projections ile DTO Dönüşleri Sorgu sonuçlarını özel DTO (Data Transfer Object) sınıflarına doğrudan eşlemek için kullanılır.
Specifications ve Criteria API Entegrasyonu Karmaşık ve dinamik sorgular oluşturmak için Specifications ve Criteria API'nin birlikte kullanımı.
@Nullable ve @NonNullApi Anotasyonları Null değer kontrolü ve güvenliği için kullanılır. Metod parametrelerinin ve dönüş değerlerinin null olup olamayacağını belirtir.
Custom ID Generators Özel ID üretme stratejileri uygulamak için kullanılır. Örneğin, UUID veya özel bir algoritma ile ID üretimi.
Entity Listeners Entity yaşam döngüsü olaylarını dinlemek ve bu olaylara tepki vermek için kullanılır. Örneğin,
@PrePersist
,@PostLoad
gibi.Hibernate Specific Features Hibernate'e özgü özelliklerin Spring Data JPA ile kullanımı. Örneğin,
@NaturalId
,@Cache
gibi.Query Hints JPA provider'ına sorgu optimizasyonu için ipuçları vermek üzere kullanılır. Örneğin,
@QueryHints
anotasyonu.Async Query Methods Asenkron sorgu metodları tanımlamak için kullanılır.
@Async
anotasyonu ile birlikteCompletableFuture
veyaListenableFuture
dönüş tipleri.Customizing Repository Base Class Tüm repository'ler için ortak işlevsellik sağlamak üzere özel bir temel sınıf oluşturmak için kullanılır.
Index Creation Veritabanı indekslerini JPA entity'leri üzerinden tanımlamak için
@Index
anotasyonu kullanılır.Composite Repositories Birden fazla repository arayüzünü birleştirerek daha kapsamlı repository'ler oluşturmak için kullanılır.
Query by Example Executor Örnek nesneler kullanarak dinamik sorgular oluşturmak için
QueryByExampleExecutor
arayüzü kullanılır.Lazy Attribute Loading Entity'lerin belirli alanlarının lazy (geç) yüklenmesini sağlamak için
@Basic(fetch = FetchType.LAZY)
kullanılır.Derived Delete Queries Method isimlendirmesi yoluyla otomatik silme sorguları oluşturmak için kullanılır. Örneğin,
deleteByLastName(String lastName)
.Entity Graphs İlişkili entity'lerin yüklenmesini özelleştirmek için
@EntityGraph
anotasyonu kullanılır.Persistable Interface Özel entity durum yönetimi için
Persistable
arayüzünün uygulanması.Attribute Override Kalıtım alınan sınıflardaki alan özelliklerini geçersiz kılmak için
@AttributeOverride
kullanılır.Lifecycle Callbacks Entity yaşam döngüsü olaylarına tepki vermek için kullanılan metodları işaretlemek için
@PrePersist
,@PostLoad
gibi anotasyonlar kullanılır.@Formula Anotasyonu Veritabanı tarafında hesaplanan alanları entity'lere eklemek için kullanılır. SQL ifadeleri ile özel hesaplamalar yapılabilir.
Repository Populators Test veya geliştirme amaçlı olarak veritabanını otomatik olarak doldurmak için kullanılır.
Querydsl Integration Tip güvenli sorgular oluşturmak için Querydsl kütüphanesi ile entegrasyon sağlar.
Derived Count Queries Belirli kriterlere uyan kayıt sayısını döndüren metodlar oluşturmak için kullanılır. Örneğin,
countByLastName(String lastName)
.@Transient Anotasyonu Entity sınıflarında veritabanına kaydedilmeyecek geçici alanları işaretlemek için kullanılır.
Batch Insert/Update Toplu ekleme ve güncelleme işlemlerini optimize etmek için kullanılır. JDBC batch işlemleriyle entegre edilebilir.
@ColumnTransformer Veritabanı sütunlarına yazarken veya okurken değerleri dönüştürmek için kullanılır.
Custom Repository Base Classes Tüm repository'ler için ortak işlevsellik sağlamak amacıyla özel temel sınıflar oluşturmak için kullanılır.
Projections with Nested Properties İç içe geçmiş property'leri içeren projeksiyonlar oluşturmak için kullanılır.
@NamedSubgraph Karmaşık entity graph'ları tanımlamak için kullanılır. İç içe ilişkileri yönetmede yardımcı olur.
Auditing with Spring Security Integration Spring Security ile entegre edilerek, mevcut kullanıcı bilgilerini otomatik olarak audit alanlarına eklemek için kullanılır.
Specification Executer Dinamik sorgu oluşturmak için
Specification
arayüzünü kullanan özel repository metodları tanımlamak için kullanılır.@Lob Anotasyonu Büyük nesneleri (Large Objects) işaretlemek için kullanılır. Örneğin, büyük metin alanları veya dosya içerikleri.
Composite Primary Key with @EmbeddedId Birleşik anahtarları tek bir gömülü sınıf olarak tanımlamak için kullanılır.
Query Derivation Mechanism Spring Data JPA'nın method isimlerinden nasıl sorgu türettiğini anlamak önemlidir. Bu mekanizma, karmaşık sorguları method isimleriyle ifade etmeyi sağlar.
@DynamicInsert Sadece null olmayan alanların insert sorgusuna dahil edilmesini sağlar. Performans optimizasyonu için kullanılabilir.
Custom Collection Mappings Özel koleksiyon tipleriyle çalışmak için kullanılır. Örneğin,
List
yerine özel bir koleksiyon sınıfı kullanmak.Dirty Checking JPA'nın entity'lerdeki değişiklikleri nasıl tespit ettiğini ve yönettiğini anlamak önemlidir.
@SqlResultSetMapping Native SQL sorgularının sonuçlarını entity'lere veya DTO'lara eşlemek için kullanılır.
Event Publishing Repository olaylarını yayınlamak ve dinlemek için Spring'in event mekanizmasıyla entegrasyon.
@Convert ve AttributeConverter Özel veri tipleri ile veritabanı sütunları arasında dönüşüm yapmak için kullanılır.
Lazy Loading ve N+1 Problemi Lazy loading'in avantajları ve dezavantajları, özellikle N+1 sorgu problemi ve çözümleri.
Persistence Context ve First Level Cache JPA'nın persistence context'i ve bunun first-level cache olarak nasıl çalıştığını anlamak.
Second Level Cache Hibernate veya diğer JPA sağlayıcıları ile ikinci seviye önbellek kullanımı.
Soft Delete Implementation Kayıtları fiziksel olarak silmek yerine işaretleyerek silme işlemi gerçekleştirmek.
Streaming Query Results Büyük veri setleri için sorgu sonuçlarını stream olarak işlemek.
@SqlResultSetMapping ve @ConstructorResult Karmaşık SQL sorgularının sonuçlarını özel DTO'lara eşlemek için kullanılır.
Repository Fragments Repository arayüzlerini daha modüler hale getirmek için kullanılır. Farklı fragment'lar farklı işlevsellikler sağlayabilir.
@JoinFormula İlişkileri SQL formülleri kullanarak tanımlamak için kullanılır. Karmaşık join senaryolarında faydalıdır.
Multi-Tenancy Support Çoklu kiracı (multi-tenant) uygulamalar için veritabanı şeması veya veritabanı bazında ayrım yapmak.
@FilterDef ve @Filter Hibernate'in filter mekanizmasını kullanarak dinamik filtreler uygulamak.
Optimistic Locking with @Version Eşzamanlı güncellemeleri yönetmek için iyimser kilitleme mekanizmasının kullanımı.
Pessimistic Locking Kötümser kilitleme stratejileri ve bunların ne zaman kullanılacağı.
Derived Exists Queries Belirli bir kritere uyan kayıtların varlığını kontrol eden sorgular türetmek.
@Immutable Değişmez entity'leri işaretlemek ve bunların davranışlarını anlamak.
Lifecycle Callbacks vs. Entity Listeners Entity yaşam döngüsü olaylarını yönetmenin farklı yolları ve bunların karşılaştırılması.
Bulk Delete and Update Operations Toplu silme ve güncelleme işlemlerinin performans etkileri ve dikkat edilmesi gereken noktalar.
Query Plan Cache JPA provider'ın sorgu planı önbelleğini anlamak ve optimize etmek.
Integration Testing with @DataJpaTest Spring Boot ile JPA katmanını test etmek için
@DataJpaTest
anotasyonunun kullanımı.Performance Tuning and Best Practices Spring Data JPA uygulamalarında performans iyileştirme teknikleri ve en iyi uygulamalar.