25 Haziran 2016 Cumartesi

Hibernate Many-to-Many Relationship (XML Haritalama) Örneği


@ManyToMany

Çoktan çoğa ilişki için kullanılır. Örnek üzerinden işleyelim.




Öğrencilerin ve derslerin olduğu bir okulu düşünelim. Hem bir öğrenci birden fazla derse kayıt yaptırabilir hem de bir ders birden fazla öğrenci tarafından alınabilir. Fatma fizik ve türkçe derslerini almış Türkçe dersi ise Ece ve Fatma tarafından alınmış.


0-Kullanılan Teknolojiler

Eclipse IDE
Maven 3.3.9
Hibernate 4.0.1.Final
MySQL 5.1


1-İlişki Tablosu



Many-to-Many ilişkiye sahiptir. Hem ders hemde ogrencinin id değerine sahip yeni bir tablo oluştu.



2-Proje





3-Entity (Model) Sınıfları

Ogrenci.java

package com.hasanburakavci.model;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Ogrenci implements Serializable{

        private static final long serialVersionUID = 1L;

        private int id;
        private String ad;
        private String soyad;
 
        private Set<Ders> dersler= new HashSet<Ders>(0);

        //Yapılandırıcı
        public Ogrenci() {
   
        }
  
        //------Setter-Getter------
       
  
}



Ders.java

package com.hasanburakavci.model;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Ders implements Serializable {

        private static final long serialVersionUID = 1L;
 
        private int id;
        private String ad;
        private String ogretmen;
        private Set<Ogrenci> ogrenciler = new HashSet<Ogrenci>(0);

        // ---------Yapılandırıcı-------------
        public Ders() {

        }

        // ----------Setter-Getter-------------
        
}



4-XML Haritalama Dosyaları

Ogrenci.hbm.xml Dosyası

<?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="com.hasanburakavci.model.Ogrenci" table="ogrenci">
                <id name="id" type="java.lang.Integer">
                        <column name="OGRENCI_ID" />
                        <generator class="identity" />
                </id>
                <property name="ad" type="string">
                        <column name="AD" />
                </property>
                <property name="soyad" type="string">
                        <column name="SOYAD" />
                </property>
                <set cascade="all" fetch="select" inverse="false" name="dersler"
                        table="ogrenci_ders">
                        <key>
                                <column name="OGRENCI_ID" />
                        </key>
                        <many-to-many class="com.hasanburakavci.model.Ders">
                                <column name="DERS_ID" />
                        </many-to-many>
                </set>
        </class>
</hibernate-mapping>




Ders.hbm.xml Dosyası


<?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="com.hasanburakavci.model.Ders" table="ders">   <id name="id" type="java.lang.Integer">    <column name="DERS_ID"/>    <generator class="identity"/>   </id>   <property name="ad" type="string">    <column name="AD"/>   </property>   <property name="ogretmen" type="string">    <column name="OGRETMEN"/>   </property>   <set fetch="select" inverse="true"
name="ogrenciler" table="ogrenci_ders">    <key>     <column name="DERS_ID"/>    </key>    <many-to-many class="com.hasanburakavci.model.Ogrenci">
    <column name="OGRENCI_ID"/>    </many-to-many>   </set> </class> </hibernate-mapping>


5-HibernateUtil Sınıfı

package com.hasanburakavci.util;

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


public class HibernateUtil {

        //SessionFactory oluşturuluyor.
        private static SessionFactory sessionFactory;
        static{
                Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
        }
        //Diğer sınıflardan getSessionFactory metoduyla sessionFactory çağırılıyor.   
        public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}



6-Hibernate Application Sınıfı

package com.hasanburakavci;

import org.hibernate.Session;

import com.hasanburakavci.model.Ogrenci;
import com.hasanburakavci.model.Ders;
import com.hasanburakavci.util.HibernateUtil;

public class HibernateApplication {
      public static void main(String[] args){
          //HibernateUtil sınıfından SessionFactory çağrıllp Session oluşturuluyor.
          Session session= HibernateUtil.getSessionFactory().openSession();
          
          try {
               session.beginTransaction();
               //ogrenci1 oluşturuldu.
               Ogrenci ogrenci1= new Ogrenci();
               ogrenci1.setAd("Ece");
               ogrenci1.setSoyad("Ece");
              
               //ogrenci2 oluşturuldu.
               Ogrenci ogrenci2= new Ogrenci();
               ogrenci2.setAd("Fatma");
               ogrenci2.setSoyad("Fatma");
               
               //ders1 oluşturuldu.
               Ders ders1= new Ders();
               ders1.setAd("Türkçe");
               ders1.setOgretmen("Duygu");
               
               //ders2 oluşturuldu
               Ders ders2= new Ders();
               ders2.setAd("Fizik");
               ders2.setOgretmen("Ali");
               
               //ders nesnelerine öğrenciler eklendi.
               ders1.getOgrenciler().add(ogrenci1);
               ders1.getOgrenciler().add(ogrenci2);
               ders2.getOgrenciler().add(ogrenci2);
               
               //ogrenci nesnelerine dersler eklendi.
               ogrenci1.getDersler().add(ders1);
               ogrenci2.getDersler().add(ders1);
               ogrenci2.getDersler().add(ders2);
         
               /*Sadece ogrenci kaydediliyor. Sebebi Ogrenci.hbm.xml dosyasındaki
               cascade=all olmasıdır.(Gerekli açıklamalar Cascade konusunda)*/
               session.save(ogrenci1);
               session.save(ogrenci2);
               session.getTransaction().commit();
          } catch (Exception e) {
               /*Eğer hata meydana gelirse Transaction ile yapılan işlem 
               geriye sarılıp iptal eiliyor*/
               session.getTransaction().rollback();
          }finally {
               //her durumda session işlemi sonlandırılıyor.
               session.close();
          }
  
     }
}



7-Pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
  <groupId>com.hasanburakavci</groupId>
  <artifactId>MerhabaHibernate</artifactId>
  <version>0.0.1-SNAPSHOT</version>
<dependencies>
        <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
  <version>5.1.6</version>   </dependency>   <dependency>   <groupId>org.hibernate</groupId>   <artifactId>hibernate-core</artifactId>   <version>4.0.1.Final</version>   </dependency>   </dependencies> </project>


8.Hibernate.cfg.xml Dosyası

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping  resource="Ogrenci.hbm.xml"/>
        <mapping  resource="Ders.hbm.xml"/></session-factory>
</hibernate-configuration>



9-Konsol

.
.
.
INFO: HHH000262: Table not found: ders
Haz 20, 2016 10:18:01 AM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: ogrenci
Haz 20, 2016 10:18:01 AM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: ogrenci_ders
Haz 20, 2016 10:18:01 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: insert into ogrenci (AD, SOYAD) values (?, ?)
Hibernate: insert into ders (AD, OGRETMEN) values (?, ?)
Hibernate: insert into ogrenci (AD, SOYAD) values (?, ?)
Hibernate: insert into ders (AD, OGRETMEN) values (?, ?)
Hibernate: insert into ogrenci_ders (OGRENCI_ID, DERS_ID) values (?, ?)
Hibernate: insert into ogrenci_ders (OGRENCI_ID, DERS_ID) values (?, ?)
Hibernate: insert into ogrenci_ders (OGRENCI_ID, DERS_ID) values (?, ?)
ogrenci, ders, ogrenci_ders adında  üç tablo ve bu tablolara eklenen veriler veritabanına kaydedildi.




10-Veritabanı Tabloları




ogrenci tablosuna AD ve SOYAD kolonları eklendi.





ders tablosuna AD ve OGRETMEN kolonları eklendi.





ogrenci_ders adında ek bir tablo oluştu. Bu tablo hangi dersin hangi öğrenci tarafından alındığını göstermektedir.

Hiç yorum yok:

Yorum Gönder