Merhaba arkadaşlar. Bu yazıda sizlerle Complex Composite Key konusunu öğreneceğiz.
Önceki yazıdan hatırlayacağınız üzere Simple Composite Key ile bir ya da birden fazla alanı Id olarak kullanabiliyorduk ve bir Java sınıfında Id alanlarını tutabiliyorduk. Bu sınıfı @IdClass notasyonu ile de belirtiyorduk.
Complex Composite Key konusunda ise biz başka bir entity sınıfını Id alanı olarak tanıtıp iki entity sınıfının aynı Id’yi kullanmasını sağlayabiliyoruz. Örneğin bir araba sınıfımız var ve bir de ruhsat sınıfımız. Ruhsat sınıfımız içinde araba sınıfından bir nesneyi Id olarak tanıtacağız. Şimdi örnek kodlara bakalım.
Araba.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package complex; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Araba implements Serializable { private static final long serialVersionUID = 1L; @Id private int arabaId; private String marka; private String model; public int getArabaId() { return arabaId; } public void setArabaId(int arabaId) { this.arabaId = arabaId; } public String getMarka() { return marka; } public void setMarka(String marka) { this.marka = marka; } public String getModel() { return model; } public void setModel(String model) { this.model = model; } } |
Araba entity sınıfımız gördüğünüz üzere son derece basit. Bir Id alanı var ve marka ile model adında da iki alanı mevcut.
Ruhsat.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package complex; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; @Entity public class Ruhsat implements Serializable { private static final long serialVersionUID = 1L; @Id @OneToOne @JoinColumn(name = "ArabaId") private Araba arabaObjesi; private String ruhsatNo; public Araba getArabaObjesi() { return arabaObjesi; } public void setArabaObjesi(Araba arabaObjesi) { this.arabaObjesi = arabaObjesi; } public String getRuhsatNo() { return ruhsatNo; } public void setRuhsatNo(String ruhsatNo) { this.ruhsatNo = ruhsatNo; } } |
Ruhsat sınıfımız içinde başka hangi entity içindeki Id alanını kullanacaksak o entity sınıfından bir nesne oluşturduk ve onu @OneToOne ve @JoinColumn ile işaretledik. @OneToOne bire-bir ilişkiyi temsil eder. Yani Ruhsat tablosu ile Araba tablosu arasında bire-bir ilişki olacaktır. Başka durumlar için @OneToMany, @ManyToOne da kullanılabilinir. Bunun yanında iki kolonu birbirine de @JoinColumn notasyonu ile bağladık ve ilişkinin bu kolon üzerinden olacağını söyledik.
Ruhsat sınıfımızda Id alanına bir araba objesi atayarak biz JPA’ya Ruhsat sınıfının Araba sınıfı ile aynı Id alanına sahip olmasını söylüyoruz.
Bunun yanında istersek kendimiz de Ruhsat sınıfı içinde bir Id alanı belirleyebilir ve çalışma zamanında Araba sınıfından Id alanını çekebiliriz. Bunun için kodumuzu şöyle düzenlememiz gerekir:
Ruhsat2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
@Entity public class Ruhsat implements Serializable { private static final long serialVersionUID = 1L; @Id private int ruhsatId; @MapsId @OneToOne @JoinColumn(name = "ArabaId") private Araba arabaObjesi; private String ruhsatNo; public Araba getArabaObjesi() { return arabaObjesi; } public void setArabaObjesi(Araba arabaObjesi) { this.arabaObjesi = arabaObjesi; } public String getRuhsatNo() { return ruhsatNo; } public void setRuhsatNo(String ruhsatNo) { this.ruhsatNo = ruhsatNo; } public int getRuhsatId() { return ruhsatId; } public void setRuhsatId(int ruhsatId) { this.ruhsatId = ruhsatId; } } |
Ruhsat2 sınıfımız içinde kendi Id alanımız olan ruhsatId alanımızı oluşturduk. Araba sınıfındaki Id alanı ile aynı Id alanını yine kullanmak istediğimizden bir arabaObjesi nesnesi yine türettik ve onu yine @OneToOne ve @JoinColumn ile işaretledik. Burada farklı olan durum ise @MapsId notasyonu kullanmamızdır. Bu notasyon tıpkı az önceki işlem gibi gider Araba tablosundan Id alanını alır ve akabinde bizim @Id notasyonu ile işaretlediğimiz alana aldığı değeri atar. Önceki örneğimizde @Id notasyonu ile işaretlediğimiz alan doğrudan veritabanı ile ilişkiye girerken bu örnekte doğrudan bir ilşkisi yok ve çalışma zamanında gerekli değeri alıyor.
Bu yazımızda da bu kadar arkadaşlar. Gelecek yazımızda EntityManagerFactory ve EntityManager nesnelerinin elde edilmesi konularına değineceğiz. Sağlıcakla kalın.