JPA

JPA 05-Complex Composite Key

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

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

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

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.