Hibernate Ders04 - Inheritance Mapping - I

Veritabanı tabloları ile kalıtım sınıfları haritalanabilir.

Hibernatede 3 çeşit kalıtım haritalama stratejisi vardır.
  • Hiyerarşi başına tablo (I-II. indisli konuda mevcut )
  • Somut sınıf başına tablo (III-IV. indisli konuda mevcut )
  • Alt sınıf başına tablo (V-VI. indisli konuda mevcut )
Hiyerarşi başına tablo haritalamada tüm hiyerarşi başına sadece tek tablo gereklidir
Discriminator yani ayırıcı olarak bilinen ekstra bir kolon sınıfı tanıyabilmek için gereklidir. Fakat nullable değerler tabloda depolanır.

Somut sınıf başına tabloda, her sınıf başına tablo oluşturulur. Fakat kopya kolonlar alt tablolara eklenir.

Altsınıf başına tabloda, her sınıf için bir tablo foreign key yani bir yabancı anahtarla oluşturulur. Bu yüzden kopya kolonlar olmaz.

Şimdi aşağıdaki diyagrama uygun bir örnek yapacağız.



Hiyerarşi başına bir tablo örneği

Main.java
package test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Main {

 public static void main(String[] args) {

  
     Configuration cfg=new Configuration();  
     cfg.configure("hibernate.cfg.xml");
     SessionFactory factory=cfg.buildSessionFactory();
     Session session=factory.openSession();
     Transaction t=session.beginTransaction();  

  Personel p = new Personel();
  p.setAd("enes");

  Maas m = new Maas();
  m.setAd("enes2");
  m.setMaas(3500);

  Araba a = new Araba();
  a.setAd("enes3");
  a.setMarka("opel");
  a.setModel("astra");

  session.persist(p);
  session.persist(m);
  session.persist(a);

  t.commit();
  session.close();
  System.out.println("basarili islem !");

 }

}

Personel.java

package test;

public class Personel {
 private int id;
 private String ad;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getAd() {
  return ad;
 }

 public void setAd(String ad) {
  this.ad = ad;
 }

}

Maas.java
package test;

public class Maas extends Personel {
 private int maas;

 public int getMaas() {
  return maas;
 }

 public void setMaas(int maas) {
  this.maas = maas;
 }
}

Araba.java
package test;

public class Araba extends Personel {
 private String marka;
 private String model;

 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;
 }

}

hibernate.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>  

 <class name="test.Personel" table="PersTab" discriminator-value="perstab">  
  <id name="id">  
   <generator class="increment"></generator>  
  </id>  
   

   <discriminator column="type" type="string"></discriminator>  
            <property name="ad"></property>   
 <subclass name="test.Maas" discriminator-value="maastab">  
  <property name="maas"></property>  
 </subclass>  
            
 <subclass name="test.Araba" discriminator-value="arabatab">  
  <property name="marka"></property>  
  <property name="model"></property>  
 </subclass>  
            
 </class>  

</hibernate-mapping>


hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>  
        <property name="hbm2ddl.auto">update</property>  
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>  
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>  
        <property name="connection.username">**kullaniciAdiniz**</property>  
        <property name="connection.password">**sifreniz**</property>  
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>  
    <mapping resource="hibernate.hbm.xml"/>  
    </session-factory>  
</hibernate-configuration>


Yorumlar

Bu blogdaki popüler yayınlar

Java SE Ders24 - Composition (Kompozisyon)

Spring Ders20 - Aspect Oriented Programming - AspectJ Annotation Style

JSF Ders30 - Page Template (Sayfa Şablonu)