24 Haziran 2016 Cuma

Hibernate One-to-Many Relationship (Anotasyon) Örneği


@OneToMany

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




Öğrencilerin ve sınıfların olduğu bir okulu düşünelim. Bir öğrenci sadece bir sınıfa kayıt yaptırabilir. Aynı anda iki sınıfta bulunamaz. Fakat aynı sınıfta birden fazla öğrenci bulunabilir.


0-Kullanılan Teknolojiler

Eclipse IDE
Maven 3.3.9
Hibernate 4.0.1.Final
MySQL 5.1


1-İlişki Tablosu



One-to-Many ilişkiye sahiptir. ogrenci tablosuna sinif tablosuna ait sinif_ID kolonu biz eklemediğimiz halde otomatik olarak eklenmiştir. Bunun sebebi one-to-many ilişkisidir.


2-Proje





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

Ogrenci.java

package com.hasanburakavci.model;

import java.io.Serializable;

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.ManyToOne;
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;
 //Birçok öğrenci aynı sınıfa kayıt olabilir dedik.
 @ManyToOne(cascade=CascadeType.ALL)
 private Sinif sinif;
  
 //Yapılandırıcı
 public Ogrenci() {
   
 }
 
 //------Setter-Getter------
  
}





Sinif.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.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="sinif")
public class Sinif 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;
  //Bir sınıfa birden fazla öğrenci kayıt olabilir dedik.
  @OneToMany(mappedBy="sinif")
  private Set<Ogrenci> ogrenci = new HashSet<Ogrenci>();
  
  //---------Yapılandırıcı-------------
  public Sinif() {
   
  }
  
  //----------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.Sinif;
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("ogrenci1");
               ogrenci1.setSoyad("ogrenci1");
              
               //ogrenci2 oluşturuldu.
               Ogrenci ogrenci2= new Ogrenci();
               ogrenci2.setAd("ogrenci2");
               ogrenci2.setSoyad("ogrenci2");
               
               //ogrenci3 oluşturuldu.
               Ogrenci ogrenci3= new Ogrenci();
               ogrenci3.setAd("ogrenci3");
               ogrenci3.setSoyad("ogrenci3");
               
               //sinif1 oluşturuldu.
               Sinif sinif1= new Sinif();
               sinif1.setAd("sinif1");
               sinif1.setOgretmen("ogretmen1");
               
               //sinif2 oluşturuldu
               Sinif sinif2= new Sinif();
               sinif2.setAd("sinif2");
               sinif2.setOgretmen("ogretmen2");
               
               //sinif nesnelerine ogrenciler eklendi.
               sinif1.getOgrenci().add(ogrenci1);
               sinif1.getOgrenci().add(ogrenci3);
               sinif2.getOgrenci().add(ogrenci2);
               
               //ogrenci nesnelerine sinif eklendi.
               ogrenci1.setSinif(sinif1);
               ogrenci2.setSinif(sinif2);
               ogrenci3.setSinif(sinif1);
               
               //ogrenciler veritabanına kaydediliyor.
               session.save(ogrenci1);
               session.save(ogrenci2);
               session.save(ogrenci3);
               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.Sinif"/>
        </session-factory>
</hibernate-configuration>


8-Konsol

.
.
.
INFO: HHH000262: Table not found: sinif
Haz 19, 2016 10:23:41 AM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: ogrenci
Haz 19, 2016 10:23:41 AM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: sinif
Haz 19, 2016 10:23:42 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: insert into sinif (AD, OGRETMEN) values (?, ?)
Hibernate: insert into ogrenci (AD, sinif_ID, SOYAD) values (?, ?, ?)
Hibernate: insert into sinif (AD, OGRETMEN) values (?, ?)
Hibernate: insert into ogrenci (AD, sinif_ID, SOYAD) values (?, ?, ?)
Hibernate: insert into ogrenci (AD, sinif_ID, SOYAD) values (?, ?, ?)
ogrenci, sinif adında iki tablo ve bu tabloya eklenen veriler veritabanına kaydedildi.


9-Veritabanı Tabloları




ogrenci tablosunda AD ve SOYAD kolonlarına ek olarak sinif_ID adında kolon gelmiştir. Bu bize sinif tablosu hakkında bilgi vermektedir. Çünkü hakim taraftır.





sinif tablosuna AD ve OGRETMEN kolonları eklendi. ogrenci tablosuna ait bir bilgi bulunmamaktadır. mappedBy="sinif" diyerek hakim olmayan tarafı sinif olarak belirledik. Eğer demeseydik iki tarafta hakim taraf olacaktı ve birbirlerinden haberdar olacaklardı. Böylece sinif_ogrenci adında üçüncü bir tablomuz olacaktı.




Bu tablo sayesinde sinif artık ogrenci tablosundan haberdar olacaktı. sinif_ID tarafında sinif nesnelerinin id değerleri, ogrenci_Id tarafında ogrenci nesnelerinin id değerleri bulunmaktadır.

Hiç yorum yok:

Yorum Gönder