25 Haziran 2016 Cumartesi

Hibernate Many-to-Many Relationship (Anotasyon) Ö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.


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;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="ogrenci")
public class Ogrenci implements Serializable{

        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="ID")
        private int id;
        @Column(name="AD")
        private String ad;
        @Column(name="SOYAD")
        private String soyad;
        @ManyToMany(cascade=CascadeType.ALL)
        //Ders sınıfına ManyToMany ile bağlandı.
        @JoinTable(name="ogrenci_ders", 
        joinColumns={@JoinColumn(name="OGRENCI_ID")},
        inverseJoinColumns={@JoinColumn(name="DERS_ID")})
        private Set<Ders> ders= 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;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "ders")
public class Ders implements Serializable {

        private static final long serialVersionUID = 1L;
 
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="ID")
        private int id;
        @Column(name="AD")
        private String ad;
        @Column(name="OGRETMEN")
        private String ogretmen;
        //Ogrenci sınıfına ManyToMany ile bağlandı.
        @ManyToMany(mappedBy="ders")
        private Set<Ogrenci> ogrenciler = new HashSet<Ogrenci>(0);

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

        }

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

}





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



5-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.getDers().add(ders1);
               ogrenci2.getDers().add(ders1);
               ogrenci2.getDers().add(ders2);
         
               /*Ogrenci sınıfında cascadeType=All olduğu için sadece ogrenci 
               nesneleri kaydediliyor.*/
               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();
          }
  
     }
}



6-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>


7.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 class="com.hasanburakavci.model.Ogrenci"/>
        <mapping class="com.hasanburakavci.model.Ders"/>
        </session-factory>
</hibernate-configuration>

8-Konsol

.
.
.
INFO: HHH000262: Table not found: ders
Haz 19, 2016 4:36:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: ogrenci
Haz 19, 2016 4:36:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: ogrenci_ders
Haz 19, 2016 4:36:53 PM 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.


9-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 tablodan Öğrenci tablosunun hakim taraf, Ders tablosu hakim olamayan taraf olduğu çıkarılabilir. Çünkü ilk kolon OGRENCI_ID alanıdır. Eğer mappedBy="ders" demeseydik Ders tablosu da hakim tablo olacaktı. O durumda ders_ogrenci adında bir tablo daha olurdu.

Hiç yorum yok:

Yorum Gönder