Hibernate

Hibernate 2 – @Table, @Column, @GeneratedValue, @SecondaryTable, @Temporal

Merhaba arkadaşlar, bu yazı ile birlikte Hibernate derslerine devam ediyoruz.

Bu yazıda;

@Table ile oluşturacaağımız tablonun adını değiştirmeyi,

@Column ile oluşturacağımız tablodaki sütun adlarını değiştirmeyi,

@GeneratedValue ile auto ‘id’ üretmeyi ve Veritabanımızda sequence oluşturmayı,

@Temporal ile veri tabanımıza Tarih ve Saat girişleri yapmayı,

@SecondaryTable ile aynı class’tan birden fazla tablo oluşturmayı öğreneceğiz.

 

Dersimize eclipse üzerinden devam edeceğiz ve yine Maven tabanlı yapacağız. Bir önceki derste Maven projesi nasıl açılır ve kullanılır görmüştük. Ver derslerimize yine aynı proje üzerinden ilerleyeceğiz.

Yine PostgreSQL ‘ de Hibernate adında bir veritabanı oluşturuyoruz.

 

İlk örneğimize başlıyoruz.

 

1 Resim Ders 2

 

@Entity(name = “MY_STUDENT”)       diyerek tablomuza bir isim verebiliriz, bir farklı kullanım ise

@Table  Annotation’ını kullanarak aynı şekilde  tablomuza bir isim verebiliriz,

@Table(name = “MY_STUDENT”)     eğer bunlardan hiç birini kullanmaz isek tablomuzun ismi class ismi ile aynı olucaktır.

Bir diğer Annotation ise @Column, tabloda oluşturacağımız sütunların ismini değiştirmemize yarıyor. Eğer kullanmaz isek tablomuzun isimleri oluşturduğumuz property’ler ile aynı olacaktır.

 

@GeneratedValue ise biz her seferinde yeni bir kayıt eklediğimizde manual olarak ‘id’ vermemize gerek kalmıyor auto olarak kendi her kayıt için ‘id’ oluşturuyor. Veritabanımızda ‘sequence’ nesnesini de auto oluşturmakta.

 

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

@Entity(name = "MY_STUDENT")
//@Table(name = "MY_STUDENT")
public class Student {

	@Id
	@GeneratedValue
	@Column(name = "STUDENT_ID")
	private int studentId;
	
	@Column(name = "STUDENT_NAME")
	private String name;
	
	@Column(name = "STUDENT_SURNAME")
	private String surname;

	public Student(String name, String surname) {
		super();
		this.name = name;
		this.surname = surname;
	}
	
	public int getStudentId() {
		return studentId;
	}

	public void setStudentId(int studentId) {
		this.studentId = studentId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}
	
}

 

Main methodumuzun bulundu class’ımızda ise bu sefer her kayıt için ‘id’ vermemize gerek kalmadı. Kendisi zaten otomatik bir şekilde oluşturacak.

 

2 Resim Ders 2

 

Resimde de görüldüğü üzere ‘id’ değerini biz vermedik.

 

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

public class Main {

	public static void main(String[] args) {
		
		Student student1 = new Student("Ferhat", "Aykan");
		Student student2 = new Student("Enes", "Çınar");
		
		
		SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
		
		Session session = sessionFactory.openSession();
		
		session.save(student1);
		session.save(student2);
		session.save(new Student("Ahmet", "Aykan"));
		session.save(new Student("Ugur", "Baş"));
	
		
		session.beginTransaction().commit();
		
	}
}

 

Bir önceki derste hazırladığımız hibernate.cfg.xml dosyamızda hiç bir değişiklik yapmadan uygulamamızı çalıştırdığımızda ;

 

3 Resim Ders 2

 

Resimde de görüldüğü gibi tablo ve sütunların isimlerinin değiştiğini görmekteyiz.

Id değerini vermedimiz halde auto oluştuğunuda görmekteyiz ve veritabanımızda hibernate_sequence nesnesinin oluştuğunu Data Source Explorer de görmekteyiz.

 

Sequence Nedir?

Primary key (birincil anahtar) olarak kullanılan alanlar özel bir yapıda değilse otomatik artan alan olarak kullanılır. Veri tabanında  otomatik artan alanlar kullanmak için sequence’lere ihtiyacımız var.

 

PostgreSQL de ise aynı şekilde tablomuz oluştuğunu aşağıdaki resimden görmüş olduk.

 

4 Resim Ders 2

 

Bir diğer örneğimizde ise;

@GeneratedValue(strategy = GenerationType.AUTO) 

Id değerimizin otomatik oluşturulmasında  strategy özelliğini vermek uygulamamızın daha performanslı çalışmasını sağlamaktadır.

 

        @Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "STUDENT_ID")
	private int studentId;

 

 

@SecondaryTable(name = “TableName”) ;

Aynı class’tan ikinci bir tablo oluşturmak için @SecondaryTable annotation’u kullanırız.

Peki hangi property’lerin oluşturacağımız ikinci tabloya eklenmesini istersek

@Column(table = “tableName”) belirtmemiz gerekiyor.

 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SecondaryTable;

@Entity(name = "MY_STUDENT")
//@Table(name = "MY_STUDENT")
@SecondaryTable(name = "StudentDetail")
public class Student {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "STUDENT_ID")
	private int studentId;
	
	@Column(name = "STUDENT_NAME")
	private String name;
	
	@Column(name = "STUDENT_SURNAME")
	private String surname;

	@Column(name = "EMAIL", table = "StudentDetail")
	private String email;
	
	@Column(table = "StudentDetail")
	private String phone;
	
	@Column(table = "StudentDetail")
	private String adress;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}

	public Student(String name, String surname, String email, String phone, String adress) {
		super();
		this.name = name;
		this.surname = surname;
		this.email = email;
		this.phone = phone;
		this.adress = adress;
	}

	public int getStudentId() {
		return studentId;
	}

	public void setStudentId(int studentId) {
		this.studentId = studentId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAdress() {
		return adress;
	}

	public void setAdress(String adress) {
		this.adress = adress;
	}
	
	
	
}

 

Main method’un bulunduğu class’a baktığımızda parametre alan constructor’ımıza değerleri gönderiyoruz.

 

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

public class Main {

	public static void main(String[] args) {
		
		Student student1 = new Student("Ferhat", "Aykan", "[email protected]", "0555", "ADANA");
		Student student2 = new Student("Enes", "Çınar", "enescinar@..", "0554", "SIVAS");
		Student student3 = new Student("Uğur", "Baş", "ugurbas@..", "0553", "BURSA");

		SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
		Session session = sessionFactory.openSession();

		session.save(student1);
		session.save(student2);
		session.save(student3);
		session.save(new Student("Salih", "Öğün", "salih@...", "0555", "ANKARA"));
		session.save(new Student("Levent", "İyibakanlar", "levent@..", "0555", "ESKISEHIR"));
		session.save(new Student("Furkan", "Uslu", "crazyfurkan@..", "0555", "TAVŞANLI"));
		
		
		session.beginTransaction().commit();
		
	}
}

 

hibernate.cfg.xml dosyasında hiç bir değişiklik yapmadan uygulamamızı çalıştırdığımızda;

 

5 Resim Ders 2

 

Resimde de görüldüğü gibi bir my_student ve studentdetail tablolarının oluştuğunu görmekteyiz.

my_student tablomuzda oluşturduğumuz primarykey, studentdetail tablosuna foreignkey olarak eklediğini görmekteyiz.

PostgreSQL veri tabanımıza baktığımızda ise aynı tabloların orada oluştuğunu görmekteyiz.

PostgresSQL de ufak bir sorgu ile bir kullanıcının tüm verilerini aynı tabloda gösterebiliriz.

 

6 Resim Ders 2

 

SQL Editor’u açmak için ilk önce resimde ok işaretiyle gösterildiği ikona tıklayıp SQL sorgumuzu yazarak resmin alt tarafında bütün verileri aynı tabloda göstermiş olduk.

 

Bir sonraki örneğimizde  @Temporal kullanımına bakacağız.

Bu annotation ise veri tabanımıza tarih girişi yapmamızı sağlar.

Örneğin bir kullanıcının kayıt olduğu tarih veya doğum günü , işe alınma vs, gibi verileri tutmamızı sağlar.

Kullanımı ise Date arabirimini kullanarak yapacağız.

Student class’mızda aşağıdaki gibi kullanıyoruz.

 

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SecondaryTable;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity(name = "MY_STUDENT")
//@Table(name = "MY_STUDENT")
@SecondaryTable(name = "StudentDetail")
public class Student {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "STUDENT_ID")
	private int studentId;
	
	@Column(name = "STUDENT_NAME")
	private String name;
	
	@Column(name = "STUDENT_SURNAME")
	private String surname;

	@Column(name = "EMAIL", table = "StudentDetail")
	private String email;
	
	@Column(table = "StudentDetail")
	private String phone;
	
	@Column(table = "StudentDetail")
	private String adress;
	
	//@Temporal(value = TemporalType.TIME) // Bu sadece saat ve dk verileri için
	//@Temporal(value = TemporalType.TIMESTAMP) // Bu ise bütün zaman verileri için tarih - saat, gün ay yıl saat dk sn
	
	@Temporal(value = TemporalType.DATE) // Bu ise sadece tarih belirtir gün ay yıl, 29/06/1994 gibi
	@Column(name = "TARIH")
	private Date date;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}
	public Student(String name, String surname, String email, String phone, String adress, Date date) {
		super();
		this.name = name;
		this.surname = surname;
		this.email = email;
		this.phone = phone;
		this.adress = adress;
		this.date = date;
	}
	public int getStudentId() {
		return studentId;
	}
	public void setStudentId(int studentId) {
		this.studentId = studentId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSurname() {
		return surname;
	}
	public void setSurname(String surname) {
		this.surname = surname;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAdress() {
		return adress;
	}
	public void setAdress(String adress) {
		this.adress = adress;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
}

 

Main method’umuzda ise ;

import java.util.Date;

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

public class Main {

	public static void main(String[] args) {
		
		Student student1 = new Student("Ferhat", "Aykan", "[email protected]", "0555", "ADANA", new Date());
		Student student2 = new Student("Enes", "Çınar", "enescinar@..", "0554", "SIVAS", new Date());
		Student student3 = new Student("Uğur", "Baş", "ugurbas@..", "0553", "BURSA", new Date());

		// new Date() ile şuandaki tarihi alabiliriz.
		
		SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
		Session session = sessionFactory.openSession();

		session.save(student1);
		session.save(student2);
		session.save(student3);
		session.save(new Student("Salih", "Öğün", "salih@...", "0555", "ANKARA", new Date()));
		session.save(new Student("Levent", "İyibakanlar", "levent@..", "0555", "ESKISEHIR", new Date()));
		session.save(new Student("Furkan", "Uslu", "crazyfurkan@..", "0555", "TAVŞANLI", new Date()));
		
		
		session.beginTransaction().commit();
		
	}
}

new Date() nesne si ile şuan ki tarihi alabiliriz.

Uygulamamızı çalıştırdığımız da veri tabanımıza tarih verisi eklemiş olduk..

 

6 Resim Ders 2

 

Bugünlük burada sonlandırıyorum, bir sonraki dersimizde birden fazla class ile bir den fazla tablo oluşturup aralarındaki ilişkilerinden bahsedeceğim, @Temporal annotations’un diğer kullanımlarını da anlatacağım görüşmek üzere 🙂

 

Yorum Yap