Entity inheritance in JPA
Merhaba Arkadaşlar,
Jpa java standartı olduğu için nesne’ye yönelimli tüm kavramları destekler. Bugüne kadar bir entity bir tablo’ya karşılık geldiği şekilde geliştirme yapardık.Şimdi ise biraz daha ileri seviye ilişkiler ele alacağız . Java Persistence API de kalıtımı inceliyeceğiz . 3 tür kalıtım stratejisi vardır bunlar :
– JOINED ,
– SINGLE_TABLE ,
– TABLE_PER_CLASS
Şimdi bu stratejilerin hepsini kullanıp veritabanında nasıl çıktısı var görelim . Kurgumuz şöyle olsun bir Araç sınıfımız olsun ve Binek ve ticari araç olarak iki tip araç olsun , sonrasındada alt sınıflarda Otomobil , Kayonet ve Bisiklet sınıfımız farklı araç tipindeki sınıflarımızı miras alsın.
İlk önce abstract sınıf olan Araç sınıfımızı yazalım .
Arac.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 41 42 43 44 45 46 47 48 |
package io.bilisim.entitiesTwo; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; import javax.persistence.TableGenerator; /* * mehmet kilic * www.turkishh.com * */ @Entity @Table(name = "ARAC") //Bahsettiğimiz stratejiyi burada tanımlıyoruz @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public abstract class Arac { //burada kullanıcağımız sequence'i biz yönetiyorz ARAC_GEN isminde bir tane tabloda tutuyoruz. @TableGenerator(name = "ARAC_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", allocationSize = 1) @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "ARAC_GEN") private int idArac; private String uretici; public int getIdArac() { return idArac; } public void setIdArac(int idArac) { this.idArac = idArac; } public String getUretici() { return uretici; } public void setUretici(String uretici) { this.uretici = uretici; } } |
Şimdi ise araç tiplerimiz olan BinekArac ve TicariArac sınıflarımızı yazıyoruz Arac sınıfından miraz alarak,
BinekArac.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 |
package io.bilisim.entitiesTwo; import javax.persistence.MappedSuperclass; /* * mehmet kilic * www.turkishh.com * */ @MappedSuperclass public abstract class BinekArac extends Arac { private int koltukSayisi; public int getKoltukSayisi() { return koltukSayisi; } public void setKoltukSayisi(int koltukSayisi) { this.koltukSayisi = koltukSayisi; } } |
TicariArac.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 |
package io.bilisim.entitiesTwo; import javax.persistence.MappedSuperclass; /* * mehmet kilic * www.turkishh.com * */ @MappedSuperclass public abstract class TicariArac extends Arac { private int tasimaKapasitesi; public int getTasimaKapasitesi() { return tasimaKapasitesi; } public void setTasimaKapasitesi(int tasimaKapasitesi) { this.tasimaKapasitesi = tasimaKapasitesi; } } |
@MappedSuperClass notasyonuna biraz değinecek olrusak bu notasyonun kullanıldığı sınıflar entitiy olarak sayılmazlar , veritabanında tablo olarak karşılıkları olmaz doğal olarakta sorgu yazılmaz.
Şimdi ise Otomobil , Kamyonet ve Bisiklet sınıflarımızı yazalım ,
Otomobil.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 |
package io.bilisim.entitiesTwo; import javax.persistence.Entity; /* * mehmet kilic * www.turkishh.com * */ @Entity public class Otomobil extends BinekArac { private int kapiSayisi; public int getKapiSayisi() { return kapiSayisi; } public void setKapiSayisi(int kapiSayisi) { this.kapiSayisi = kapiSayisi; } } |
Kamyonet.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 |
package io.bilisim.entitiesTwo; import javax.persistence.Entity; /* * mehmet kilic * www.turkishh.com * */ @Entity public class Kamyonet extends TicariArac { private int konteynerSayisi; public int getKonteynerSayisi() { return konteynerSayisi; } public void setKonteynerSayisi(int konteynerSayisi) { this.konteynerSayisi = konteynerSayisi; } } |
Bisiklet.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 |
package io.bilisim.entitiesTwo; import javax.persistence.Entity; /* * mehmet kilic * www.turkishh.com * */ @Entity public class Bisiklet extends BinekArac { private int seleBoyutu; public int getSeleBoyutu() { return seleBoyutu; } public void setSeleBoyutu(int seleBoyutu) { this.seleBoyutu = seleBoyutu; } } |
Database ile bağlantımızı kuralım Persistence.xml dosyamızı oluşturalım.
Persistence.xml
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 |
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="jpaDatam" transaction-type="RESOURCE_LOCAL"> <class>io.bilisim.entitiesTwo.Arac</class> <class>io.bilisim.entitiesTwo.BinekArac</class> <class>io.bilisim.entitiesTwo.TicariArac</class> <class>io.bilisim.entitiesTwo.Kamyonet</class> <class>io.bilisim.entitiesTwo.Otomobil</class> <class>io.bilisim.entitiesTwo.Bisiklet</class> <properties> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/postgres" /> <property name="javax.persistence.jdbc.user" value="postgres" /> <property name="javax.persistence.jdbc.password" value="root" /> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> </properties> </persistence-unit> </persistence> |
Test etmemiz için bir sınıf yazalım ve çalıştıralım.
TestProject.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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
package io.bilisim.test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import io.bilisim.entitiesTwo.Bisiklet; import io.bilisim.entitiesTwo.Kamyonet; import io.bilisim.entitiesTwo.Otomobil; /* * mehmet kilic * www.turkishh.com * */ public class TestProject2 { public static void main(String[] args) { System.out.println("************** Başladı **************"); EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaDatam"); /* Create EntityManager */ EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); Bisiklet bisiklet = new Bisiklet(); bisiklet.setUretici("Bianchi"); bisiklet.setKoltukSayisi(1); bisiklet.setSeleBoyutu(30); em.persist(bisiklet); Otomobil otomobil = new Otomobil(); otomobil.setUretici("Lamborghini"); otomobil.setKoltukSayisi(2); otomobil.setKapiSayisi(2); em.persist(otomobil); Kamyonet kamyonet = new Kamyonet(); kamyonet.setTasimaKapasitesi(100); kamyonet.setUretici("Mercedes"); kamyonet.setKonteynerSayisi(2); em.persist(kamyonet); transaction.commit(); System.out.println("************** Bitti **************"); } } |
Şimdi normalde bu şekilde 4 tane tablomuz olması lazım doğal olarak Arac , Otomobil ,Bisiklet ve Kamyonet isminde ama burada jpa kalıtım kullandığımız için tek tablo oluşacaktır.
Stratejimiz InheritanceType.SINGLE_TABLE olduğundan çıktısı şu şekilde olacaktır :
InheritanceType.JOINED :
InheritanceType.TABLE_PER_CLASS :
Umarım yararlı olmuştur ?
İyi Çalışmalar