Entity ve DTO’larda Sık Kullanılan Anotasyonlar
Entity nedir?
Entity, Java Persistence API (JPA) kullanılarak ilişkisel bir veritabanı tablosuna eşlenen bir Java sınıfıdır. Entity sınıfları, veritabanı tablolarındaki kayıtları temsil eder ve veritabanı işlemlerini gerçekleştirmek için kullanılır. Entity sınıfları, JPA tarafından sağlanan anotasyonlar kullanılarak tanımlanır.
1-@Entity: Entity anotasyonu ile sınıfın bir varlık olduğunu belirtiriz.
2-@Table: Table anotasyonu ile varlığın hangi tabloya eşleneceğini belirtebiliriz.
3-@Id: Id anotasyonu ile birincil anahtar alanını belirtiriz.
4-@GeneratedValue: GeneratedValue anotasyonu ile de bu birincil anahtarın nasıl üretileceğini belirleyebiliriz.
5-@Column: Column anotasyonu ile sınıf alanlarının veritabanındaki sütunlara nasıl eşleneceğini belirleyebiliriz.
6- @OneToMany, @ManyToOne, @OneToOne, @ManyToMany: Bu anotasyonlar kullanılarak varlıklar arasındaki ilişkiler tanımlanır.
7-@JoinColumn: JoinColumn anotasyonu ilişki için kullanılan sütunu belirtir.
8-@Temporal: Temproral Tarih ve zaman türlerini belirtir.
9-@Enumerated: Enumerated anotasyonu Enum türünü belirtir.
Örnek bir Entity kodlaması
Employee.java
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@Entity
@Table(name = "employees")
@Getter
@Setter
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", nullable = false, length = 100)
private String firstName;
@Column(name = "last_name", nullable = false, length = 100)
private String lastName;
@Temporal(TemporalType.DATE)
@Column(name = "birth_date")
private Date birthDate;
@Enumerated(EnumType.STRING)
@Column(name = "status")
private Status status;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
@ManyToMany
@JoinTable(
name = "employee_projects",
joinColumns = @JoinColumn(name = "employee_id"),
inverseJoinColumns = @JoinColumn(name = "project_id")
)
private List<Project> projects;
}
public enum Status {
ACTIVE,
INACTIVE
}
Department.java
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name = "departments")
@Getter
@Setter
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false, length = 100)
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
}
Project.java
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name = "projects")
@Getter
@Setter
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false, length = 100)
private String name;
@ManyToMany(mappedBy = "projects")
private List<Employee> employees;
}
Kod açıklaması
Employee Sınıfı:
- @Entity: Employee sınıfının bir JPA varlığı olduğunu belirtir.
- @Table(name = “employees”): Bu varlığın employees tablosuna eşleneceğini belirtir.
- @Id: id alanının birincil anahtar olduğunu belirtir.
- @GeneratedValue(strategy = GenerationType.IDENTITY): id alanının otomatik olarak artan bir değer olduğunu belirtir.
- @Column: Sütun özelliklerini tanımlar (örn. nullable, length).
- @Temporal(TemporalType.DATE): birthDate alanının sadece tarih bilgisini tutacağını belirtir.
- @Enumerated(EnumType.STRING): status alanının enum türünde bir değer olduğunu ve veritabanında string olarak saklanacağını belirtir.
- @ManyToOne ve @JoinColumn(name = “department_id”): department alanının ManyToOne ilişkisi olduğunu ve department_id sütununa eşleneceğini belirtir.
- @ManyToMany ve @JoinTable: projects alanının ManyToMany ilişkisi olduğunu ve ilişkiyi tanımlayan employee_projects ara tablosunu belirtir.
Department Sınıfı:
- @Entity: Department sınıfının bir JPA varlığı olduğunu belirtir.
- @Table(name = “departments”): Bu varlığın departments tablosuna eşleneceğini belirtir.
- @Id: id alanının birincil anahtar olduğunu belirtir.
- @GeneratedValue(strategy = GenerationType.IDENTITY): id alanının otomatik olarak artan bir değer olduğunu belirtir.
- @Column: Sütun özelliklerini tanımlar.
- @OneToMany(mappedBy = “department”): employees alanının OneToMany ilişkisi olduğunu ve ilişkiyi department alanı üzerinden yönettiğini belirtir.
Project Sınıfı:
- @Entity: Project sınıfının bir JPA varlığı olduğunu belirtir.
- @Table(name = “projects”): Bu varlığın projects tablosuna eşleneceğini belirtir.
- @Id: id alanının birincil anahtar olduğunu belirtir.
- @GeneratedValue(strategy = GenerationType.IDENTITY): id alanının otomatik olarak artan bir değer olduğunu belirtir.
- @Column: Sütun özelliklerini tanımlar.
- @ManyToMany(mappedBy = “projects”): employees alanının ManyToMany ilişkisi olduğunu ve ilişkiyi projects alanı üzerinden yönettiğini belirtir.
Bu örnek, JPA’da varlık sınıflarını tanımlarken ve ilişkileri belirtirken kullanılan temel anotasyonları kapsamlı bir şekilde göstermektedir.
DTO Anotasyonları ve Kod Örneği
DTO’lar genellikle veri taşımak için kullanıldığından, JPA anotasyonları içermezler. Bunun yerine, veri doğrulama ve serileştirme/deserileştirme için kullanılan diğer anotasyonlar içerebilirler. Örneğin, javax.validation ve Jackson kütüphanelerinden anotasyonlar.
Anotasyonlar
-@NotNull, @Size, @Min, @Max, vb.: Veri doğrulama anotasyonları (javax.validation).
- @JsonProperty, @JsonIgnore, @JsonInclude, vb.: Serileştirme/deserileştirme anotasyonları (Jackson).
- @Pattern: Belirli bir regex desenine uygunluğu doğrulamak için kullanılır.
- @Email: E-posta formatında olup olmadığını doğrulamak için kullanılır.
- @Past, @Future: Tarihlerin geçmişte veya gelecekte olup olmadığını doğrulamak için kullanılır.
import javax.validation.constraints.*;
import com.fasterxml.jackson.annotation.*;
@Getter
@Setter
public class EmployeeDTO {
@NotNull
@JsonProperty("id")
private Long id;
@NotNull
@Size(min = 1, max = 100)
@JsonProperty("first_name")
private String firstName;
@NotNull
@Size(min = 1, max = 100)
@JsonProperty("last_name")
private String lastName;
@Past
@JsonProperty("birth_date")
private Date birthDate;
@NotNull
@JsonProperty("status")
private String status;
@Email
@JsonProperty("email")
private String email;
@Pattern(regexp = "^\\+?[0-9. ()-]{7,25}$", message = "Phone number is invalid")
@JsonProperty("phone_number")
private String phoneNumber;
@JsonIgnore
private String internalCode;
}
Bu anotasyonlar, Spring Boot uygulamalarını hızlı ve etkili bir şekilde oluşturmanıza, yapılandırmanıza ve yönetmenize yardımcı olur.
Tüm yazılarımı https://sercanozbek.medium.com/ adresinden inceleyebilirsiniz.
Bana ulaşmak için: LinkedIn