Hibernate

Hibernate 4 – @OneToOne, @OneToMany, @JoinColumn, @SequenceGenerator

Hibernate Dersleri

Merhaba arkadaşlar derslerimize devam ediyoruz.

İlişkilere bir önceki derste ufak bir giriş yapmıştık.  Bu dersimiz de yeni dipnotlar kullanarak ilişkilerimizi geliştireceğiz.

Bu örneğimizde maven tabanlı yeni bir proje acıyoruz ve gerekli dependecy’leri ekliyoruz. İlk dersimizde bahsetmistim nasıl ekleneceğini oradan bakabilirsiniz.

Peki bu dersimiz de yeni dipnotlar kullanacağız dedik. Nedir bunlar?

İlk olarak kullanacağımız annotation(dipnot) @OneToOne’nın kullanımını göreceğiz.

@OneToOne nedir?

Şöyle bir örnek verebiliriz.  Bu örneğimizde bir öğrencinin sadece bir adresi olduğu varsayıyoruz.

Student <-> Adress

Bir öğrencinin bir tane adresi var ve bir adresi de sadece bir öğrenciye verebiliyoruz. Yani ikinci bir öğrenci aynı adreste kalamaz, bizim örneğimizde.

 

Untitled

Resmimize baktığımızda her öğrencinin bir tane evi var ve aynı evde iki öğrenci kalamıyor.

Şimdi yeni bir proje oluşturmuştuk ve projemize iki tane sınıf ekleyelim. Biri Student, diğeri ise Adress olucak ve ikisini de @Entity tanımlayacağız.

 

İlk olarak Adress clasını tanımlıyoruz.

Burada Adress clasımızı @Entity olarak belirttik ve bir class’ın @Entity olabilmesi için iki şartımız vardı.

@Entity ve @Id dipnotunu kullanmak zorundaydık.

Bu örneğimiz de @Column içinde yeni bir özellik tanımladık. ‘length = 40’ bu bizim tablomuzun o sütunu için kaç karakterlik bir alana sahip olduğunu belirtiyoruz. Varsayılan değer 255 tir.

 

Şimdi sıradaki @Entity’miz olan Student sınıfımıza bakıyoruz.

 

Burada Adres nesnesinin üzerinde @OneToOne dipnotunu kullandık.  Bu sayede programımızı çalıştırdığımızda Student tablomuza adress_id adında bir foreign key bilgisi eklenecek.

Burada birde @Column dipnotu içinde ‘unique = false’ property tablosu tanımladık. Bu demek oluyor ki o sütunda aynı isimden birden fazla tanımlanabilir. Biz onu true yapsaydık aynı isimden o sütunda tanımlanamazdı. Ara ara böyle ufak detaylar vereceğim.

 

hibernate.cfg.xml dosyamızda oluşturduğumuz @Entity’leri bildiriyorduk.

 

Daha sonra main metodumuzun bulunduğu sınıfa gelelim.

Burada her zamanki gibi SessionFactory ve Session nesneleri oluşturup Session nesnesiyle de tablolarımızı oluşturup verileri ekliyorduk.

Burada oluşturduğumuz bütün @Entity nesnelerini save ediyoruz. Programımızı çalıştırdığımızda ise karşımıza şöyle bir görüntü çıkacaktır.

 

2.RESİM

 

İki tane tablo oluştuğunu görmekteyiz.

Adres tablomuzun primary key’i Student tablosuna foreign key olarak eklendiğini ve Foreign key’in bulunduğu sütunun adı ‘adress_adress_id’ şeklind olduğunu görmekteyiz. Bu örneğe dikkatlice bakarsak iki tane tablomuz ve her tablonun kendine ait primary key’i mevcut ama biri 1 den başlarken diğeri 4 ten başlamaktadır. Biz bu örneğimizde bir tane sequence oluşturup ve her tablomuzda ki primary key için aynı sequence kullandığımızdan veriler eklendikçe otomatik bir şekilde sayı değeri artmaktadır.

 

Biz aynı örneğimizde ufak değişikler yaparak daha güzel gözükmesini sağlayacağız.

İlk olarak her tablo için bir tane sequnce oluşturacağız ve kaçtan başlatacağımızı biz belirteceğiz ve her veri eklendiğinde tablomuzda ki primary key olarak tanımladığımız ‘id’ değeri otomatik bir şekilde artacaktır.

Bir diğer değişikliğimiz ise Student tablosuna Adress tablosundan gelen foreign key’e sahip sütunun adını değiştireceğiz.

Burada yeni bir sequence oluşturulmasını söyledik.

name olarak verdiğimiz değeri @GeneratedValue generator içinde bildiriyoruz.

sequenceName ise veritabanında oluşturulacak sequence’mizin adı olucak.

initialValue ise bu sequence değeri kaçtan başlayacak onu belirtiyoruz.

 

Student sınıfımıza bakalım.

 

Burada aynı şekilde @SequenceGenerator kullandık ve değerini 100 ile başlamasını söyledikten sonra @GeneratedValue’de bunu bildirdik.

Burada bir başka kullanım ise @JoinColumn, Student tablosuna eklenecek foreign key sütunun adını değiştirdik.

Main metodumuzu ve hibernate.cfg.xml dosyamızda değişiklik yapmadan programızı çalıştırdığımızda..

3.RESİM

 

Tabloda da görüldüğü üzere Adres tablosundan gelen foreign key sütunun adını değiştirdik ve primary key olan kısımları verdiğimiz değerlerden başlattık. @OneToOne hakkında biraz olsun bilgi sahibi olduk.

Bir sonraki konumuz olan @ManyToOne’a bakalım.

@ManyToOne nedir?

Şöyle bir örnek verebiliriz.

Öğrenci <–> Üniversite düşünün ama bu örneğimizde öğrencimizin aynı anda birden fazla Universite’de okumasına izin vermeyeceğiz.

 

4.RESİM

Resimde de görüldüğü üzere birden fazla öğrenci aynı üniversitede okurken aynı öğrenci birden fazla üniversitede okuyamıyor. Bu duruma biz ManyToOne diyoruz. n <–> 1 ilişki

 

Bir önceki örneğimizin içine birde University sınıfı ekleyeceğiz ve onuda @Entity tanımlayacağız.

 

Burada name propery’in üzerindeki @Column dipnotunda ‘unique =  true’ tanımladım. Burada demek istediğim aynı üniversite isminden birden fazla kayıt olmasın.

 

Yeni bir class açtık ve @Entity olarak tanımladık ve bunu hibernate.cfg.xml dosyasında belirmeyi unutmayınız.

 

Sıradaki işlemimiz ise Student sınıfında University nesnesi oluşturmaya, oluştuduktan sonra constructor içinde parametre olarak tanımlayınız ve yine University sınıfımızın nesnesinin set ve get metotlarını oluşturunuz.

 

 

Burada görüldüğü üzeri University nesnesinin üzerinde @ManyToOne şeklinde dipnot kullandık. @JoinColumn ile de  Student tablomuza eklenecek sütunun adını değiştirdik.

 

Adress sınıfımızda bir değişiklik yapmıyoruz. Main metodumuzun bulunduğu class’ta ekleme işlemleri yapacağız.

 

 

İki tane yeni üniversite eklededikten sonra öğrencilerimizle ilişkilendirdik. Programı çalıştırdığımızda ise.

 

5.RESİM

 

Resimde de görüldüğü gibi 3 tane tablo oluştu ve foreign key’lerimizi student tablosuna ekledik.

 

Bir sonraki dersimizde @OneToMany ve @ManyToMany ilişkilerini inceleyeceğiz.  Bugünlük bu kadar sağlıcakla kalın 🙂

 

Dumlupınar Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği 3.sınıf öğrencisiyim.
Bir Java aşığı olarak Java teknolojileri üzerinde kendimi geliştiriyorum.
Adana’lıyım