Hibernate Ders 08 – Inheritance

Merhaba Arkadaslar,
Bu yazimizda Hibernate Inheritance (kalitim) ile ilgili bir uygulamaya yapmaya calisacagiz.

Bu konuda 3 yaklasim bulunmaktadir. Burada bunlari tek tek inceleyecegiz ve farklarini gorecegiz.

  • SINGLE_TABLE
  • JOINED
  • TABLE_PER_CLASS

Hemen ornegimize gecelim ! Yeni bir package olusturalim.. hibernate8_implementingInheritance diyorum ve Vehicle adinda yeni bir sinif olusturuyorum…

private int vehicleId;
private String vehicleName;

Getter//setter ve @Entity, @Id , @GeneratedValue(strategy=GenerationType.Auto)  … gerekli notasyonlari ekliyoruz.

Ornegimizde Vehicle sinifindan kalitilan 2 adet daha sinifimiz olacak bunlar  FourWheeler ve TwoWheeler.

FourWheeler.java 

package hibernate8_ImplementingInheritance; 
import javax.persistence.Entity; @Entity
public class FourWheeler extends Vehicle {

private String SteeringWheel;
public String getSteeringWheel() {

 return SteeringWheel;
 }
public void setSteeringWheel(String SteeringWheel) {
this.SteeringWheel = SteeringWheel;

 }
}


TwoWheeler.java

package hibernate8_ImplementingInheritance;

import javax.persistence.Entity;
@Entity
public class TwoWheeler extends Vehicle {

private String SteeringHandle;

public String getSteeringHandle() {
 return SteeringHandle;
 }

public void setSteeringHandle(String SteeringHandle) {
 this.SteeringHandle = SteeringHandle;
 }
}

Kisacasi 2 yeni sinif olusturduk ve Vehicle sinifimizdan kalittik ve yeni alanlar ekledik, getter setter metotlarini olusturduk. Tabi @Entity notasyonunu unutmuyoruz !

VehicleTest sinifimizi olusturalim, her zamanki gibi daha onceki orneklerimizden bir test sinifini kopyalayip refactor ile ismini degistirip gerekli sablonu elde ettikten sonra uygulamaya hazir hale getirebiliriz.

AnnotationConfiguration config = new AnnotationConfiguration();
 config.addAnnotatedClass(FourWheeler.class);
 config.addAnnotatedClass(TwoWheeler.class);
 config.configure("hibernate.cfg.xml");

config.addAnnotadedClass a kullanacagimiz FourWheeler.class ve TwoWheeler.class i vermeyi unutmayalim.

Vehicle, FourWheeler ve TwoWheeler sinifimizdan birer nesne olusturup basta belirtigimiz
1) SINGLE_TABLE
2) JOINED
3)TABLE_PER_CLASS

notasyonlarina gore tablolarimizi inceleyecegiz..

VehicleTest.java 

package hibernate8_ImplementingInheritance;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
*
* @author Levent
*/
public class VehicleTest {

public static void main(String[] args) {
AnnotationConfiguration config = new AnnotationConfiguration();
config.addAnnotatedClass(FourWheeler.class);
config.addAnnotatedClass(TwoWheeler.class);
config.configure("hibernate.cfg.xml");

new SchemaExport(config).create(true, true);

Vehicle vehicle = new Vehicle();
vehicle.setVehicleName("FORD");

TwoWheeler bike = new TwoWheeler();
bike.setVehicleName("Bike");
bike.setSteeringHandle("bike steering handle");

FourWheeler car = new FourWheeler();
car.setVehicleName("Porsche");
car.setSteeringWheel("Porshe Streering Wheel");

SessionFactory factory = config.buildSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
session.save(vehicle);
session.save(car);
session.save(bike);

session.getTransaction().commit();

}
}

Notasyon eklemeden calistirip sonucu gorelim !
Hibernate Outputunu dikkatli incelemekte fayda var !

Vehicle adinda bir tablomuz olustu… Icerigine bakalim…

Tablo alanlarina bakacak olursak dtype  alanini gorururuz, default olarak bu isimde gelmektedir, burada dikkat ederseniz sinifimizin adini bu alana ekledigini gorebiliriz.

Vehicle icin vehiclename ve vehicleid  oldugu icin, steeringwheel ve steeringhandle  alani NULL oldugunu dikkat edelim.

Diger siniflar icin de Vehicle sinifindan kalittiklari alanlar ve kendi icerisinde tanimladigi alanin dolu oldugunu diger alanin NULL oldugunu gorebiliriz.

dtype  alan adini degistirelim, bunun icin su notasyonu kullanabiliriz.

@DiscriminatorColumn(
name = "NEW_VEHICLE_TYPE",
discriminatorType = DiscriminatorType.STRING)
public class Vehicle implements Serializable { .... }

VehicleTest.java yi tekrar calistiralim ve tablomuzu gorelim.

Alan adinin new_vehicle_type olduguna dikkat edelim.

Bir baska notasyon olarak @DiscriminatorValue den bahsedelim..
Tabloda gordugumuz uzere new_vehicle_type alanindaki degerler hangi siniftan nesne olusturup eklediysek o sinifin isimleri. Istersek bu isimleri degistirebiliriz..

TwoWheeler olarak eklenen ismi, Bike Class olarak degistirdik..

@DiscriminatorValue("Bike Class")
public class TwoWheeler extends Vehicle {...}

FourWheeler olarak eklenen ismi, Car Class olarak degistirdik. Diledigimiz ismi verebiliriz…

@DiscriminatorValue("Car Class")
public class FourWheeler extends Vehicle {...}

Calistirip ne olup ne bittigini gorelim..


Simdi de @Inheritance stratejilerini uygulamaya baslayalim.

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Vehicle implements Serializable { ...}


Gordugunuz gibi sonuc degismedi, varsayilan olarak SINGLE_TABLE dir.
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) notasyonu yerine

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

fourwheeler, twowheeler ve vehicle adinda 3 tane tablomuz olustugunu gorebiliriz.

fourwheeler tablomuz.

twowheeler tablomuz…

vehicle tablomuz….

Gordugunuz gibi her sinifin kendinise ait tablosu olustu.
Her sinifin kendi alanlari olustu.Alt siniflar(FourVehicle ve TwoVehicle ust sinif olan Vehicle sinifinin vehiclename alanini kalittilar)

Simdi de 3.notasyonumuzu uygulayalim ve sonuclari gorelim.

@Inheritance(strategy = InheritanceType.JOINED)

Bu notasyonda da 3 tablo olustu (fourwheeler, twowheeler,vehicle)

fourwheeler tablomuz..

twowheeler tablomuz…

vehicle tablomuz…

Gordugunuz gibi vehicle tablomuzda 3 sinif icin de ortak olak alanlari (vehicleid, vehiclename) ekledi ve 3 sinifin bu alanlarinin degerini bu tabloya yazdi.

fourwheeler ve twowheeler tablolarinda ise kendilerine ozgu olan alanlarin oldugunu gorebiliriz. (fourwheeler icin steeringwheel ve twowheeler icin steeringhandle)

3 notasyonu da denemis olduk ve dersimizin de sonuna geldik 🙂

kaynak kodlar :HibernateTutorialV8

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *