Hibernate Ders-5 OneToMany Association(Bire-Çok İlişki)
Merhaba arkadaşlar bu yazımda ilişkisel veritabanı türlerinden ikincisi olan OneToMany(Bire-Çok) ilişkisini anlatacağım.
OneToMany(Bire-Çok) nedir?
Bire-çok ilişkisi veritabanımızdaki bir tablodaki bir kaydın diğer tablomuzda bulunan kayıtlardan birden fazlasıyla ilişki kurmasına denir. Örnek verecek olursak bir personelimiz olsun. Bu personelimizde ait birden fazla adres olabilir. Şimdi bir örnek üzerinde inceleyim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="Hibernate_Ders3_SaveDeleteUpdate" transaction-type="RESOURCE_LOCAL"> <class>com.furkan.pojo.Personel</class> <class>com.furkan.pojo.Adres</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernateornekler"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="19961903"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/> </properties> </persistence-unit> </persistence> |
Persistence.xml dosyamızda kalıcı sınıflarımız ve veritabanı bilgilerimizi tanımladık.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">19961903</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernateornekler</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping class="com.furkan.pojo.Personel"/> <mapping class="com.furkan.pojo.Adres"/> </session-factory> </hibernate-configuration> |
Hibernate ayar dosyamızda gerekli kalıcı sınıflarımız, veritabanı bilgileri ve hibernate ayarlarını gerekli şekilde tanımladık. Ve tablolarımızı otomatik oluşturmasını istedik.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
package com.furkan.pojo; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; /** * * @author Furkan KOÇ * */ @Entity public class Adres implements Serializable { private static final long serialVersionUID = 1L; private Integer adresId; private String cadde; private String mahalle; private String sokak; private Integer apNo; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getAdresId() { return adresId; } public void setAdresId(Integer adresId) { this.adresId = adresId; } public String getCadde() { return cadde; } public void setCadde(String cadde) { this.cadde = cadde; } public String getMahalle() { return mahalle; } public void setMahalle(String mahalle) { this.mahalle = mahalle; } public String getSokak() { return sokak; } public void setSokak(String sokak) { this.sokak = sokak; } public Integer getApNo() { return apNo; } public void setApNo(Integer apNo) { this.apNo = apNo; } } |
Adres.java sınıfımızı @Entity ile kalıcı hale getirdik ve @Id ile gerekli tanımlamayı yaptık. @GeneratedValue değerimizin stratejisi olarak Auto tanımlayarak otomatik arttırılmasını istedik.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
package com.furkan.pojo; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; 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.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; /** * * @author Furkan KOÇ * */ @Entity public class Personel implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String isim; private String soyisim; Set<Adres>adres=new HashSet<>(); @OneToMany(cascade=CascadeType.ALL) public Set<Adres> getAdres() { return adres; } public void setAdres(Set<Adres> adres) { this.adres = adres; } @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getIsim() { return isim; } public void setIsim(String isim) { this.isim = isim; } public String getSoyisim() { return soyisim; } public void setSoyisim(String soyisim) { this.soyisim = soyisim; } } |
Personel.java sınıfımıza @Entity ve @Id notasyonlarını ekleyerek kalıcı hale getirdik ve id değişkenimizin @GeneratedValue değerinde stratejisini Auto belirleyerek otomatik artmasını istedik. Burada önemli nokta @OneToMany özelliğini kullanabilmemiz için koleksiyon tanımlamamız lazım ve koleksiyona bu özelliği verebilmemiz. Görüldüğü üzere Adres sınıfı türünden Set kullanarak koleksiyon tanımladık ve bu koleksiyona bire-çok özelliğini verdik. @OneToMany özelliğine Cascade değeri vererek tek bir session işlemiyle işlemimizi yapmamızı sağladık.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
package com.furkan.yonetici; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.furkan.pojo.Adres; import com.furkan.pojo.Personel; public class Yonetici { /** * * @Furkan KOÇ */ public static void main(String[] args) { SessionFactory factory=new Configuration().configure().buildSessionFactory(); Session session=factory.openSession(); Transaction transaction=session.getTransaction(); Personel personel=new Personel(); personel.setIsim("Furkan"); personel.setSoyisim("KOC"); Adres adres=new Adres(); adres.setApNo(55); adres.setCadde("Hizir Reis"); adres.setMahalle("Evliya Celebi"); adres.setSokak("Kavak Sokak"); Adres adres2=new Adres(); adres2.setApNo(11); adres2.setCadde("Deneme Cadde"); adres2.setMahalle("Bilinmeyen Mahalle"); adres2.setSokak("Kavacik Sokagi"); personel.getAdres().add(adres); personel.getAdres().add(adres2); //-------------------------------------------------------------------------------------------- Personel personel2=new Personel(); personel2.setIsim("Osman"); personel2.setSoyisim("KORUCU"); Adres adres3=new Adres(); adres3.setApNo(81); adres3.setCadde("Organize Caddesi"); adres3.setMahalle("Genc Mahalle"); adres3.setSokak("Yurt Sokagi"); Adres adres4=new Adres(); adres4.setApNo(18); adres4.setCadde("Demirciler Caddesi"); adres4.setMahalle("Hibernate Mahalle"); adres4.setSokak("JPA Sokagi"); personel2.getAdres().add(adres3); personel2.getAdres().add(adres4); //--------------------------------------------------------------------------------------------- transaction.begin(); session.save(personel); session.save(personel2); transaction.commit(); } } |
Yonetici.java main sınıfımızda nesneleri üretip kalıcı sınıflarımızdaki değişkenlere gerekli değerleri atadık ve Transaction nesnesi ile işlemi başlatarak kaydettik.
Ve en son görüldüğü gibi tablolarımız oluştu ve gerekli kayıtlar kaydedildi.
Görüldüğü üzere bir personele birden fazla adres eklendi ve bire-çok ilişki kurmuş olduk. İyi günler…