Lombok ile Entity Sınıfı: Adım Adım Rehber (Spring Boot + JPA)

Bu rehberde Lombok kütüphanesiyle entity sınıfı oluşturmanın avantajlarını, Spring Boot + JPA projelerinde en iyi pratikleri ve sık yapılan hataları ele alıyoruz. Amaç: boilerplate kodu azaltmak, okunabilirliği artırmak ve bakım maliyetini düşürmek.

Entity Sınıfı Nedir?

Entity sınıfları, veritabanı tablolarını Java nesneleri olarak temsil eder. Örneğin Student tablosu için student_id, firstName, lastName, address, phoneNumber gibi alanlar içeren bir entity oluşturulur. Genellikle getter, setter, constructor gibi tekrar eden metotlar gerekir.

Lombok Kütüphanesi Nedir?

Lombok, Java projelerinde sık kullanılan getter, setter, toString, equals, hashCode gibi kodları anotasyonlar ile otomatik üretir. Böylece daha kısa, daha okunabilir ve daha az hataya açık entity sınıfları yazılır.

Lombok Kullanmadan Entity Sınıfı

public class Student {

  private Long student_id;
  private String firstName;
  private String lastName;
  private String address;
  private String phoneNumber;

  public Student() {}

  public Student(Long student_id, String firstName, String lastName,
                 String address, String phoneNumber) {
      this.student_id = student_id;
      this.firstName = firstName;
      this.lastName = lastName;
      this.address = address;
      this.phoneNumber = phoneNumber;
  }

  // Getter/Setter'lar...
}

Görüldüğü üzere, basit bir entity için bile çok sayıda boilerplate kod yazılıyor.

Lombok ile Entity Sınıfı

1) Lombok Bağımlılığı (Maven)

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.24</version>
  <scope>provided</scope>
</dependency>

2) Temel Anotasyonlarla Student

import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Student {
  private Long student_id;
  private String firstName;
  private String lastName;
  private String address;
  private String phoneNumber;
}
Avantajlar: Daha kısa kod, yüksek okunabilirlik, daha az hata, daha hızlı geliştirme.

JPA + Lombok En İyi Pratikler (Önemli)

⚠️ Neden @Data önerilmez?
@Data, tüm alanları kapsayan equals/hashCode ve toString üretebilir. JPA ilişkilerinde (örn. @OneToMany) tembel yükleme (lazy loading) ve döngü/performans sorunlarına yol açabilir. Bunun yerine anotasyonları seçerek kullanın.

Örnek: JPA Uyumlu Lombok Kullanımı

import jakarta.persistence.*;
import lombok.*;

@Entity
@Table(name = "students")
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = {"address"}) // potansiyel olarak uzun/özel alanları hariç tut
@EqualsAndHashCode(of = {"studentNumber"}) // iş anahtarı önerilir
public class Student {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(nullable = false, unique = true)
  private String studentNumber; // değişmeyen iş anahtarı

  @Column(nullable = false)
  private String firstName;

  @Column(nullable = false)
  private String lastName;

  private String address;

  private String phoneNumber;

  // İsteğe bağlı: Builder (DTO akışlarında faydalı)
  @Builder(toBuilder = true)
  public Student(String studentNumber, String firstName, String lastName,
                 String address, String phoneNumber) {
    this.studentNumber = studentNumber;
    this.firstName = firstName;
    this.lastName = lastName;
    this.address = address;
    this.phoneNumber = phoneNumber;
  }
}
  • @EqualsAndHashCode(of = {"studentNumber"}): Değişmeyen iş anahtarına göre tanımlayın (ID yerine).
  • @ToString(exclude = {...}): Döngü ihtimali olan koleksiyonları/ilişkileri dışarıda bırakın.
  • @Builder: Nesne kurulumunu sadeleştirir; toBuilder=true ile kopya-üzerinden-güncelleme yapılabilir.
  • İlişkilerde dikkat: @OneToMany/@ManyToOne varsa, mappedBy, fetch, cascade ayarlarını bilinçli yapın ve @ToString.Exclude, @EqualsAndHashCode.Exclude kullanın.

Pratik İpuçları

  • Alan adları: Java konvansiyonu için studentId tercih edin (student_id yerine).
  • DTO ile ayırın: Entity’yi yalın tutun, istek/yanıt için DTO kullanın.
  • Validasyon: jakarta.validation ile @NotBlank, @Size ekleyin.
  • Serileştirme: Jackson kullanıyorsanız, ilişkilerde @JsonIgnore veya @JsonManagedReference/@JsonBackReference düşünün.
Kaçın: Tüm entity’lere refleks olarak @Data koymak, ilişkili alanları toString/equals içine almak, id üzerinden equals/hashCode yazmak.

Sık Sorulan Sorular (SSS)

Lombok entity performansı etkiler mi?

Hayır. Lombok derleme zamanında kod üretir; çalışma zamanında ek yük getirmez. Performansı asıl etkileyen JPA ilişki tasarımı ve sorgu stratejisidir.

@Builder ve JPA birlikte güvenli mi?

Evet; özellikle iş anahtarı ve zorunlu alanları builder ile netleştirmek faydalıdır. JPA için parametresiz @NoArgsConstructor bulundurun.

Hangi anotasyon seti en güvenlisi?

Genellikle: @Getter/@Setter + kontrollü @EqualsAndHashCode(of={...}) + @ToString(exclude={...}) + gerekirse @Builder. @Data’yı entity tarafında kullanmamak daha güvenlidir.

Sonuç

Lombok ile entity sınıfı oluşturmak, Spring Boot ve JPA projelerinde boilerplate’i azaltır, okunabilirliği yükseltir ve hata riskini düşürür. En iyi sonuç için anotasyonları seçerek kullanın, equals/hashCode’u iş anahtarına göre tanımlayın ve ilişkilerde döngü/performans tuzaklarına dikkat edin.

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Spring Boot ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *