Hibernate

Hibernate 5 – @OneToMany, @ManyToMany, @JoinTable

Merhaba arkadaşlar derslerimize devam ediyoruz.

Bugün @OneToMany,  @ManyToMany  ve @JoinTable kullanımlarını öğreneceğiz. Bu yazım kısa olacak çoğu terimi bir önceki derslerimizde açıkladığım için bir daha açıklama yapmayacağım.

 

@OneToMany nedir?

Adından da anlaşılacağı gibi bire çok ilişkidir. Peki nasıl oluyor bir örnek üzerinde anlatayım.

Bir kişinin birden fazla evi olabileceği gibi ve aynı evlerinde tek bir sahibi olabileceğini düşünebiliriz.

1.RESİM

Resimde de görüldüğü gibi aynı evin birden fazla sahibi olamaz.

İlk adres sınıfımıza bakalım.

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

@Entity
public class Adress {

	@Id
	@SequenceGenerator(name = "ADRESS_SEQUENCE_GENERATOR", sequenceName = "ADRESS_SEQUENCE", initialValue = 100)
	@GeneratedValue(generator = "ADRESS_SEQUENCE_GENERATOR")
	@Column(name = "ADRESS_ID")
	private int adressId;
	private String street;
	private String city;
	
	public Adress() {
		// TODO Auto-generated constructor stub
	}

	public Adress(String street, String city) {
		this.street = street;
		this.city = city;
	}

	// Set Get metotları
}

Adress sınıfımızı @Entity tanımladık ve @Id’mizi oluşturduk.

İşçi sınıfımız ;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

@Entity
public class Employee {

	@Id
	@SequenceGenerator(name = "EMPLOYEE_SEQUENCE_GENERATOR", sequenceName = "EMPLOYEE_SEQUENCE", initialValue = 100)
	@GeneratedValue(generator = "EMPLOYEE_SEQUENCE_GENERATOR")
	@Column(name = "EMPLOYEE_ID")
	private int employeeId;
	private String name;
	private String surname;
	
	@OneToMany
	private List<Adress> adresses = new ArrayList<Adress>();
	
	public Employee() {
		// TODO Auto-generated constructor stub
	}

	public Employee(String name, String surname) {
		this.name = name;
		this.surname = surname;
	}

}

İşçi sınıfımızda List tanımlaması yaptık nedeni 1-n ilişki olduğu için n tarafını List şeklinde tutacağız. List yerine başka Collection’larda kullanabiliriz.

List nesnesinin set ve get metotlarını tanımlamayı unutmayalım.

Main metodumuzun bulunduğu sınıf ise;

 

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

public class Test {

	public static void main(String[] args) {
		
		Adress adress1 = new Adress("Cumhuriyet cad.", "Ankara");
		Adress adress2 = new Adress("Çankaya cad", "Ankara");
		
		Adress adress3 = new Adress("Kazım Karabekir cad.", "Ankara");
		Adress adress4 = new Adress("Seyhan cad.", "Adana");
		
		Employee employee1 = new Employee("Ferhat", "Aykan");
		employee1.getAdresses().add(adress1);
		employee1.getAdresses().add(adress2);
		
		Employee employee2 = new Employee("Hakan", "Yılmaz");
		employee2.getAdresses().add(adress3);
		employee2.getAdresses().add(adress4);
		
		
		SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
		Session session = sessionFactory.openSession();

		session.save(adress1);
		session.save(adress2);
		session.save(adress3);
		session.save(adress4);
		session.save(employee1);
		session.save(employee2);

		session.beginTransaction().commit();
		session.close();
		
	}
}

Kodlarımıza baktığımızda aynı işçimize birden fazla adres verdik.

Uygulamamızı çalıştırdığımızda;

2.RESİM

 

Üç tane tablo oluştuğunu görmekteyiz. Employee_Adress tablosunda iki tablomuzun foreign keylerini tutmaktadır.

Oluşan yeni tablodaki sütun isimlerini @JoinTable dipnotunu kullanarak değiştireceğiz.

Employee sınıfımıza ufak değişikler yapalım.

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

@Entity
public class Employee {

	@Id
	@SequenceGenerator(name = "EMPLOYEE_SEQUENCE_GENERATOR", sequenceName = "EMPLOYEE_SEQUENCE", initialValue = 100)
	@GeneratedValue(generator = "EMPLOYEE_SEQUENCE_GENERATOR")
	@Column(name = "EMPLOYEE_ID")
	private int employeeId;
	private String name;
	private String surname;
	
	@OneToMany
	@JoinTable(name = "EMPLOYEE_ADRESS" , joinColumns = @JoinColumn(name = "EMPLOYEE_ID"), 
								inverseJoinColumns = @JoinColumn(name = "ADRESS_ID"))
	private List<Adress> adresses = new ArrayList<Adress>();
	
	public Employee() {
		// TODO Auto-generated constructor stub
	}

	public Employee(String name, String surname) {
		this.name = name;
		this.surname = surname;
	}

 

Kodlarımıza baktığımızda @JoinTable dipnotu ile tablo adını ve sütun adlarını değiştirdik.

Burada iki tane joinColumns türü kullandık. Normal olarak joinColumns kullandıığımızda baskın sütunu adını değiştiriyoruz inverseJoinColumns ise bir diğer sütunun adını değiştiriyoruz.

Bu şekilde uygulamamızı çalıştırdığımızda;

3.RESİM

Sütunlarımızın adları değiştiğini görmekteyiz.

Bir diğer özelliğimiz ise @ManyToMany’dir

Bunun için şöyle bir örnek düşünebiliriz.

Bir işçi bir den fazla işte çalışabilir iken aynı işte birden fazla işçi çalışabilir.

Aynı örneğimize birde Jobs sınıfı ekliyoruz ve bunu hibernate.cfg.xml dosyamızda @Entity olduğunu belirtiyoruz.

 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

@Entity
public class Jobs {

	@Id
	@SequenceGenerator(name = "JOB_SEQUENCE_GENERATOR", sequenceName = "JOB_SEQUENCE", initialValue = 100)
	@GeneratedValue(generator = "JOB_SEQUENCE_GENERATOR")
	@Column(name = "JOB_ID")
	private int jobId;
	private String name;

	public Jobs() {
		// TODO Auto-generated constructor stub
	}

	public Jobs(String name) {
		this.name = name;
	}
                     //Set get metotları

 

Employee sınıfımızda baktığımızda

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

@Entity
public class Employee {

	@Id
	@SequenceGenerator(name = "EMPLOYEE_SEQUENCE_GENERATOR", sequenceName = "EMPLOYEE_SEQUENCE", initialValue = 100)
	@GeneratedValue(generator = "EMPLOYEE_SEQUENCE_GENERATOR")
	@Column(name = "EMPLOYEE_ID")
	private int employeeId;
	private String name;
	private String surname;
	
	@OneToMany
	@JoinTable(name = "EMPLOYEE_ADRESS" , joinColumns = @JoinColumn(name = "EMPLOYEE_ID"), 
								inverseJoinColumns = @JoinColumn(name = "ADRESS_ID"))
	private List<Adress> adresses = new ArrayList<Adress>();
	
	@ManyToMany
	@JoinTable(name = "EMPLOYEE_JOBS" , joinColumns = @JoinColumn(name = "EMPLOYEE_ID"), 
						inverseJoinColumns = @JoinColumn(name = "JOB_ID"))
	private List<Jobs> jobs = new ArrayList<Jobs>();
	
	
	public Employee() {
		// TODO Auto-generated constructor stub
	}

	public Employee(String name, String surname) {
		this.name = name;
		this.surname = surname;
	}

 

Burada List yapısını yeniden kullandık ve aynı şekilde oluşacak yeni tablomuzun adını ve sütun adlarını değiştirdik.

Uygulamamızı çalıştırdığımızda;

 

4.RESİM

 

Bu günlük bu kadar bir sonraki dersimizde görüşmek üzere kolay gelsin 🙂

 

1 Yorum

Yorum Yap