JPA & HIBERNATE EĞİTİMİ
JPA ve Hibernate eğitimi, ORM'i "yavaş" söylentisinden kurtarıp doğru kullanmayı öğreten bir programdır. JPA spec ile Hibernate implementation arasındaki fark, Persistence Context ve Session lifecycle yönetimi, Lazy ve Eager fetching kararları somut örneklerle çalışılır.
Eğitim sonunda katılımcı, N+1 problemini @EntityGraph ile keser; 1st, 2nd ve query cache katmanlarını doğru senaryoda kullanır; optimistic ve pessimistic locking arasında işlemsel risk ile seçer. HQL, JPQL, Criteria API ve native query karşılaştırması; Envers ile audit log eğitimin advanced kapanışıdır. Eğitim materyalleri Hibernate ORM belgeleri ile uyumlu hazırlanmıştır.
Katılımcı Profili
Bu eğitim, JPA ve Hibernate'i "yavaş ORM" söylentisinden kurtarıp doğru kullanmak isteyen rollere yöneliktir:
- Java Geliştiriciler: JPA spec ve Hibernate implementation kullanan mühendisler
- Backend Mühendisleri: N+1 ve lazy loading tuzaklarına çözüm arayan ekipler
- Spring Boot Geliştiriciler: Spring Data JPA ile veri katmanı yazan roller
- Veritabanı Geliştiricileri: ORM ile native SQL arasında karar veren ekipler
- Solution Architect'ler: ORM ve veri erişim stratejisi belirleyen roller
Ön Gereklilikler
Bu eğitime katılım için aşağıdaki ön bilgiler önerilir:
- Java ile temel uygulama geliştirme deneyimi
- SQL ile temel sorgu yazma (SELECT, JOIN, WHERE) bilgisi
- İlişkisel veri modeli ve normalization kavramlarına aşinalık
- Spring veya Spring Boot ile temel deneyim (tercihen)
- Maven veya Gradle build aracı kullanım bilgisi
Süresi ve Tarihi
Süre: 3 gün. Bu süre standart program içindir; ek modüllere ve hedefe göre süre özelleştirilebilir.
Eğitim tarihleri ve saatleri, ekibinizin uygunluğuna göre birlikte planlanır.
Kazanımlar
Bu programın sonunda katılımcı, JPA ve Hibernate'i "yavaş ORM" söylentisinden kurtarıp doğru kullanır:
- JPA spec ile Hibernate implementation arasındaki farkı bilir
- Persistence Context ve Session lifecycle'ı bilinçle yönetir
- Lazy ve Eager fetching; N+1 problemini @EntityGraph ile keser
- Caching katmanlarını (1st level, 2nd level, query cache) doğru senaryoda kullanır
- Optimistic ve pessimistic locking arasında işlemsel risk ile seçim yapar
- HQL, JPQL, Criteria API ve native query'i karşılaştırarak yazar
- Hibernate Envers ile audit log kurar; flush mode'ları bilir
JPA & Hibernate Eğitimi Konuları
1. JPA ve Hibernate - JSR Standart
- JPA spec ve Hibernate implementasyon
- Jakarta EE/Persistence ad geçişi
- EclipseLink alternatifi ve karşılaştırma
- ORM avantajları ve trade-off
2. EntityManager ve Persistence Context
- EntityManager rolü ve yaşam süresi
- Persistence Context: first-level cache
- persistence.xml yapısı
- Application-managed vs container-managed EM
3. Entity Lifecycle - Transient, Managed, Detached, Removed
- New (transient) state
- Managed state ve dirty checking
- Detached ve merge stratejisi
- Removed state ve flush davranışı
4. Mapping - @Entity, @Table, @Column
- @Entity ve @Table tanımı
- @Id, @GeneratedValue stratejileri
- @Column nullable, unique, length
- @Enumerated, @Temporal, @Lob
- Embedded ve @Embeddable
5. İlişkiler - @OneToMany, @ManyToMany
- @OneToOne, @OneToMany, @ManyToOne, @ManyToMany
- Unidirectional vs bidirectional ilişki
- Owning side ve mappedBy
- Join table customization
- FetchType: EAGER vs LAZY
6. Cascade ve Orphan Removal
- CascadeType: PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL
- orphanRemoval davranışı
- Cascade vs Foreign Key DDL
- Cascading silme riskleri
7. Inheritance Strategy
- SINGLE_TABLE: tek tablo, discriminator
- JOINED: alt tablo, foreign key
- TABLE_PER_CLASS: ayrı tablo
- MappedSuperclass alternatifi
- Performans ve trade-off analizi
8. JPQL ve Criteria API
- JPQL: object-oriented query language
- Named query ve dynamic query
- TypedQuery ve parameter binding
- Criteria API: tip güvenli, programmatic
- JPQL ve SQL farkı
9. Native Query ve SqlResultSetMapping
- createNativeQuery ile raw SQL
- @SqlResultSetMapping ile mapping
- Stored procedure çağrısı
- Vendor-specific query risk
10. Fetch Strategy - Eager vs Lazy
- LAZY default to-many, EAGER default to-one
- LazyInitializationException yönetimi
- Fetch join ile eager loading
- @BatchSize ile batch fetching
- EntityGraph dynamic fetch
11. N+1 Problem ve Çözümleri
- N+1 problemin tanımı ve sebebi
- JOIN FETCH ile çözüm
- @EntityGraph annotation
- Batch fetching ve subquery
- Hibernate Statistics ile tespit
12. Caching - First ve Second Level
- First-level cache (PC) otomatik
- Second-level cache: shared, opt-in
- EhCache, Hazelcast, Infinispan provider
- Query cache ve maliyet
- Cache eviction stratejileri
13. Transaction ve Isolation Level
- @Transactional Spring ile
- Propagation: REQUIRED, REQUIRES_NEW, NESTED
- Isolation: READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
- Rollback rules ve checked exception
- Transactional ile @Async tuzakları
14. Optimistic ve Pessimistic Locking
- @Version ile optimistic lock
- OptimisticLockException yönetimi
- Pessimistic lock: PESSIMISTIC_READ, WRITE, FORCE_INCREMENT
- LockTimeoutException ve fallback
15. Auditing - @CreatedDate, @ModifiedDate
- Spring Data JPA Auditing
- @CreatedBy, @LastModifiedBy
- AuditorAware ile kullanıcı tespiti
- Envers ile entity history
16. Spring Data JPA Repository
- CrudRepository, JpaRepository hiyerarşisi
- Query methods ve derived query
- @Query ile özel JPQL
- Projection: interface ve DTO
- Pagination ve Sort
17. Specifications ve QueryDSL
- JpaSpecificationExecutor ile dynamic query
- Specification compose: and, or, not
- QueryDSL ile tip güvenli sorgu
- Predicate ve dynamic filter
18. Performance Tuning - Hibernate Statistics
- Hibernate Statistics aktif etme
- SQL log: show_sql vs structured
- Open-Session-in-View tuzağı
- Hibernate Envers performans etkisi
- Connection pool tuning (HikariCP)
JPA & HIBERNATE EĞİTİMİ ile İlgili
Sıkça Sorulan Sorular ve Cevapları
JPA spec ile Hibernate implementation arasındaki fark nedir?
JPA Java EE/Jakarta EE specification — interface, annotation ve standart davranış tanımlar. Hibernate JPA'nın referans implementation'larından biri (Eclipse Link diğer alternatif). Hibernate spec dışı özellikler (criteria DSL, @Filter, custom dialect) sunar; ama bunlara bağlanmak vendor lock-in yaratır.
Persistence Context ve Session lifecycle nasıl yönetilir?
Persistence Context entity'lerin first-level cache'idir — transaction veya request kapsamında yaşar. Spring'de @Transactional ile session sınırı çizilir. Open-In-View pattern lazy loading'i view'da kullanmayı sağlar ama N+1 ve uzun-tutulan connection sorunlarına yol açar. Production'da kapatmak best practice.
N+1 problemi @EntityGraph ile nasıl çözülür?
Repository metoduna @EntityGraph(attributePaths = {"orders", "orders.items"}) ile fetch plan verilir — Hibernate JOIN üreterek tek query ile related entity'leri çeker. Dinamik graph ihtiyacı varsa programmatic EntityGraph kullanılır. JPQL'de JOIN FETCH alternatifidir; @EntityGraph daha temiz.
1st, 2nd ve query cache arasındaki fark nedir?
1st-level cache session-scope, otomatik açık, kapatılamaz — aynı session'da aynı entity ID tekrar sorgulanırsa DB'ye gitmez. 2nd-level cache (Ehcache, Hazelcast, Redis) session'lar arası — paylaşımlı, manuel açılır. Query cache literal SQL'in result set'ini cache'ler; sadece 2nd-level varsa anlamlı.
Optimistic ve pessimistic locking arasında karar?
Optimistic (@Version) çakışma az beklenen senaryolarda — commit anında version uyuşmazlığı varsa exception fırlatır. Pessimistic (SELECT FOR UPDATE) çakışma çok beklenen veya kritik işlemlerde lock alır — diğer transaction bekler. Banking uygulamalarında karma pattern yaygın.
HQL, Criteria API ve native query arasında nasıl seçim yapılır?
HQL/JPQL string-based, entity-aware sorgu — basit dinamik filtre için yetersiz. Criteria API type-safe builder, dinamik query için doğru ama söz dizimi karmaşık. Native query DB-spesifik özellikler (window function, recursive CTE) gerektiğinde gerekli. Olgun projeler genelde üçünü de farklı yerlerde kullanır.



