JPA @Embedded ve @Embeddable

Bu yazımızda, gömülü özellikleri içeren bir entity’i tek bir veritabanı tablosuna ara tablo oluşturmaya gerek kalmadan JPA ile nasıl eşleyebileceğimizi göreceğiz. Embedded objeler bir başka Entity objesinin varlığına bağlıdır. Entity’lerle bir iliski söz konusu değildir yani @ManyToOne , @OneToOne gibi anotasyonlar kullanılamaz. Embedded objeler Java nesnesi tarafından farklı sınıflar ile yönettiğimiz alanları, veritabanında aynı tabloda görmemize olanak sağlar.

Embedded objelerin bir kimliği (primary key) yoktur dolayısıyla @Id anotasyonu kullanılmaz.
Embedded objelerin durumu/değişkenleri bir başka Entity icin oluşturulan tabloya gömülür.

@Embeddable
public class Order {

	private String orderStatus;
	private String orderTotal;
	private String orderTime;
	private String orderAddresses;
	
	//constructors
        //getters and setters
        //toString

}

Sipariş sınıfımızın üstüne @Embeddable anotasyonu ekliyoruz ve böylelikle ara tablo olarak değil üye tablosunun içerisinde alan olarak verilerin tutulmasını sağlıyoruz. Tüm bu işlemleri Hibernate yönetiyor.

 

@Entity
public class Customer {

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE)
	private int id;
	private String name;
	private String surname;
	private int addresses;

	@Embedded
	private Order order;

        //constructors
        //getters and setters
        //toString
}

Customer sınıfımızda da Order’ı @Embedded anotasyonu ile ekliyoruz ve böylelikle yeni bir tabloya ihtiyaç duymadan o sınıfı gömme işlemini tamamlamış oluyoruz. Order sınıfımızı birden fazla sınıfımızın kullandığı durumlar olabilir, ve bu sınıflar kolon isimlerini farklı bir isimde tutmak isteyebilir. Bu durumda 2 tane anotasyon kullanabiliriz.

Birden fazla kolon icin isim override edilecekse @AttributeOverrides kullanilabilir. Sadece bir tane kolon icin isim override edilecekse @AttributeOverride kullanilabilir.

Örnek kullanım şu şekildedir:

 

@Embedded
	@AttributeOverrides(value ={
			@AttributeOverride(name = "orderStatus", column = @Column(name = "status")),
			@AttributeOverride(name = "orderTime", column = @Column(name = "Time"))
	})
	private Order order;
İlgini çekebilir:  Single Responsibility Prensibi Nedir?

Emre

More Reading

Post navigation