@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 IDEMaven 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 (?, ?)
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