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;
}
JPA + Lombok En İyi Pratikler (Önemli)
@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=trueile kopya-üzerinden-güncelleme yapılabilir. - İlişkilerde dikkat:
@OneToMany/@ManyToOnevarsa,mappedBy,fetch,cascadeayarlarını bilinçli yapın ve@ToString.Exclude,@EqualsAndHashCode.Excludekullanın.
Pratik İpuçları
- Alan adları: Java konvansiyonu için
studentIdtercih edin (student_idyerine). - DTO ile ayırın: Entity’yi yalın tutun, istek/yanıt için DTO kullanın.
- Validasyon:
jakarta.validationile@NotBlank,@Sizeekleyin. - Serileştirme: Jackson kullanıyorsanız, ilişkilerde
@JsonIgnoreveya@JsonManagedReference/@JsonBackReferencedüşünün.
@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.