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.
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;
Üç 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;
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;
Bu günlük bu kadar bir sonraki dersimizde görüşmek üzere kolay gelsin 🙂
Merhaba,
main() metodunu yaptığım değişikliklerden sonra çalıştırdığımda hata alıyordum.Araştırdığımda Görev Yöneticisinde javaw.exe dosyasının 5-6 adet çalıştığını gördüm.Bunları sonlandırıp main() metodunu yeniden çalıştırdığımda sorunsuz çalışıyor. javaw.exe’nin her seferinde yeniden başlamasını nasıl önlerim? Teşekkürler…
https://uploads.disquscdn.com/images/629f3202f9cb2d2bf4f12dff35c4cf88ddd52da5c64658d0c9f6217127de6749.png