Spring Boot JPA ile JOIN ve JOIN FETCH Arasındaki Farklar

Merhaba yazılım geliştiriciler! Bu yazıda Spring Boot JPA kullanarak JOIN ve JOIN FETCH arasındaki farkları ele alacağız. Eğer Hibernate veya Spring Data JPA kullanıyorsanız, performans açısından kritik olan bu iki kavramı bilmeniz büyük önem taşır.

Lazy ve Eager Fetching

Spring Boot JPA ile veritabanı ilişkilerini yönetirken Lazy (tembel yükleme) ve Eager (hemen yükleme) stratejilerini kullanabilirsiniz. Eğer bir ilişki Lazy olarak tanımlandıysa, JPA ilişkili verileri otomatik olarak yüklemez. Ancak bazı durumlarda, sorgu anında tüm verileri almak isteyebiliriz. İşte bu noktada JOIN ve JOIN FETCH devreye girer.

Entity Tanımlamaları

Örnek olarak, Sektor ve Firma entity’leri arasında çift yönlü bir @OneToMany ilişkisi olduğunu düşünelim.

Sektor Entity

@Entity
@Table(name = "sektorler")
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public class Sektor implements Serializable {
   private static final long serialVersionUID = 1L;
   
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @Column(name = "adi", length = 50)
   private String adi;

   @Column(name = "detay", length = 50)
   private String detay;

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "sektor", orphanRemoval = true)
   private List<Firma> firmalar = new ArrayList<>();
}

Firma Entity

@Entity
@Table(name = "firma", schema = "s_eminonu")
@Getter
@Setter
public class Firma implements Serializable {
   private static final long serialVersionUID = 1L;
   
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @Column(name = "adi", length = 50)
   private String adi;

   @Column(name = "email", length = 50)
   private String email;

   @Column(name = "firma_detay", length = 500)
   private String detay;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "sektor_id")
   private Sektor sektor;
}

JOIN ve JOIN FETCH Kullanımı

Aşağıdaki örnekte Sektor ile ilişkili Firma bilgilerini getiren INNER JOIN ve JOIN FETCH sorgularını tanımlıyoruz.

SektorlerRepository Interface

@Service
@RequiredArgsConstructor
public class SektorlerService {
   @Transactional()
   public List<Sektor> getAllSektorWithFirma() {
       return sektorlerRepository.fetchSektorWithFirma();
   }
}

SQL Çıktıları

INNER JOIN sorgusu ile oluşturulan SQL:

@Transactional(readOnly = true)
public interface SektorlerRepository extends JpaRepository<Sektor, Long> {
   @Query("SELECT s FROM Sektor s JOIN FETCH s.firmalar ORDER BY s.id DESC")
   List<Sektor> fetchSektorWithFirma();
}

JOIN FETCH sorgusu ile oluşturulan SQL:

SELECT 
   sektor0_.id AS id1_9_0_,
   firmalar1_.id AS id1_1_1_,
   sektor0_.adi AS adi2_9_0_,
   sektor0_.detay AS detay3_9_0_,
   firmalar1_.adi AS adi2_1_1_,
   firmalar1_.email AS email6_1_1_,
   firmalar1_.firma_detay AS firma_de4_1_1_,
   firmalar1_.sektor_id AS sektor_12_1_1_
FROM sektor sektor0_
INNER JOIN firma firmalar1_ ON sektor0_.id = firmalar1_.sektor_id
ORDER BY sektor0_.id DESC;

JOIN vs JOIN FETCH Farkı

JOIN, yalnızca sorguda belirtilen alanları getirir.

JOIN FETCH, ilgili entity ile ilişkili tüm alanları çeker.

JOIN kullanıldığında Lazy Fetching korunur, yani ilişkili veriler gerektiğinde çağrılır.

JOIN FETCH, ilişkili verileri anında yüklediği için Lazy Loading etkisini kaybettirir.

JOIN FETCH, büyük veri setlerinde gereksiz veri yüklemesine neden olabilir ve performans sorunlarına yol açabilir.

JOIN FETCH Kullanımı Ne Zaman Tercih Edilmelidir?

Eğer Lazy Fetching ile çalışan bir entity’nin ilişkili tüm verilerini anında yüklemek istiyorsanız JOIN FETCH kullanabilirsiniz. Ancak, gereksiz veri yüklemelerini önlemek için gerçekten ihtiyaç duyduğunuzda bu yöntemi tercih etmelisiniz.

Sonuç

Bu yazıda Spring Boot JPA kullanarak JOIN ve JOIN FETCH arasındaki farkları inceledik. JOIN FETCH, Lazy Fetching’i devre dışı bırakarak tüm ilişkili verileri çekerken, JOIN yalnızca ihtiyacımız olan verileri getirir. Doğru kullanım senaryosuna göre seçim yapmak, performans açısından büyük fark yaratacaktır.

Umarız bu yazı sizin için faydalı olmuştur! Daha fazla içerik için bizi takip etmeyi unutmayın.

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Spring Boot ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *