Hibernate Ders-4 OneToOne Association(Bire-Bir İlişki)
Merhaba arkadaşlar bu yazımda size ilişkisel veritabanından ve bire-bir(OneToOne) ilişkili veritabanından bahsedeceğim.
İlişkisel veritabanı : İki yada daha tablonun bir birbirleri arasında veriler sayesinde bağlantı kurulmasıyla oluşur. Örnek olarak vermek istersek Öğrenci tablomuz olsun ve bu tablomuzda öğrenci isim,soyisim ve öğrenci numarası tutulsun. Diğer tablomuzda Matematik Notlarını tutsun. Matematik notlarını öğrenci numaralarıyla ilişkilendirdiğimiz zaman ilişkisel veritabanı oluşturmuş oluyoruz. Şimdi hibernate de ilişkisel veritabanı yönetme çeşitlerine bakalım:
1-)OneToOne Association(Bire-Bir İlişki)
2-)OneToMany Association(Bire-Çok İlişki)
3-)ManyToOne Assocation(Çoğa-Bir İlişki)
4-)ManyToMany Assocation(Çoğa-Çok İlişki)
——————————————————————————————————————————————————————————————
1-)OneToOne Association(Bire-Bir İlişki) :
Bu ilişkisel veritabanı çeşidi 2 ya da daha fazla tablodaki verilerden birer adetlerini birbirine bağlar. Yukarıda verdiğim örnek bu çeşide örnektir.
Daha iyi anlamak için bir örnekle anlatalım konuyu :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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> |
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ıza kalıcı sınıfları tanımlıyoruz ve veritabanı bağlantımızı sağlıyoruz.
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 |
package com.furkan.pojo; import java.io.Serializable; 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; @Entity @Table(name="Personel") public class Personel implements Serializable { private Integer id; private String isim; private String soyisim; private Adres adres=new Adres(); public Personel() { } public Personel(String isim, String soyisim) { this.isim = isim; this.soyisim = soyisim; } @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; } @OneToOne(cascade=CascadeType.ALL) public Adres getAdres() { return adres; } public void setAdres(Adres adres) { this.adres = adres; } } |
Personel kalıcı sınıfımızda personele ait bilgiler tutuluyor ve adres nesnesi üretiliyor ve bire-bir ilişkisel veritabanı bağlantısı kuruluyor.
cascade=CascadeType.ALL => Alt nesnelere ait bütün işlemleri tek bir işlemde yapar.
Cascade Çeşitleri ve Özellikleri
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 |
package com.furkan.pojo; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @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; } } |
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 |
package com.furkan.yonetici; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.furkan.pojo.Personel; public class Yonetici { public static void main(String[] args) { SessionFactory factory=new Configuration().configure().buildSessionFactory(); Session session=factory.openSession(); Transaction transaction=session.getTransaction(); Personel personel=new Personel("Furkan", "KOC"); personel.getAdres().setApNo(18); personel.getAdres().setCadde("Hizir Reis"); personel.getAdres().setMahalle("Cumali"); personel.getAdres().setSokak("Bilinmez Sokak"); Personel personel2=new Personel("Osman", "KORUCU"); personel2.getAdres().setApNo(25); personel2.getAdres().setCadde("Kongre Caddesi"); personel2.getAdres().setMahalle("Universite Caddesi"); personel2.getAdres().setSokak("Deneme Sokagi"); transaction.begin(); session.save(personel); session.save(personel2); transaction.commit(); } } |
Görüldüğü üzere sadece Personel sınıfından ürettiğimiz nesnelere işlem yaptık ama alt nesneye ait bir işlem yapmadık. İşte Cascade burada devreye giriyor. Görüldüğü üzere tablolarımız oluşturuldu ve gerekli veri kayıtları yapıldı ve adres_adresId kolonu ile bire-bir ilişki kurulmuş oldu.