Sık Kullanılan Hibernate Annotations (Dipnotlar)

Hibernate orm aracından yararlanılarak geliştirilen projelerde veya farklı bir orm aracı kullanılarak jpa üzerinden geliştirme yapılan projelerde sıklıkla kullandığımız bazı dipnotlar,bu dipnotların kullanımı ve açıklaması aşağıda yer almaktadır.Orm araçlarını yeni kullanmaya başlayanlar için,kendim de yeni öğrenmeye başladığım ve öğrendiklerimi unutmamak,unuttuğumda ise açıp bakmak için bir Türkçe kaynak oluşturdum.

 

  • @NamedQuery

Named Query dipnotu projelerimizde sorgular yürütebilmemize olanak verir.Kullanımı ve daha detaylı bilgi için bu yazıma bakabilirsiniz.https://mesutpiskin.com/blog/jpa-namedquery-parametresiz-sorgular.html

  • @Column

Entity sınıflarında  tabloların daha önceden veritabanı yönetim sistemi ile hazırlanan kolonlarının ismini belirtmek,değiştirmek için kullanılır.Örneğim;aşağıda gördüğünüz gibi entity sınıfında bir değişkenimiz var bu değişken Siparis tablosundaki adetSparis kolonunu belirtmektedir.Fakat @Column yazdık ve SPARIS_ADETI dedik,uygulama çalıştığında veri tabanı üzerindeki tablonun adetSparis kolununun ismi SPARIS_ADETI olarak değişecektir.

@Column(name="SPARIS_ADETI")
private String adetSparis;
  • @Id

Tablolarda bulunan birincil anahtar (primary key) diye nitelendirdiğimiz kolonu belirtmek için kullanılır.Örneğin;tablomuzda bir kolon  ve ismi idSparis olsun,sparisler tablosu için gelen sparişlerin numarası olarak nitelendirelim.Her sparişin 1 adet spariş numarası olur ve unique dediğim eşsiz bir veridir yani benzeri yoktur,bu yüzden bu kolonumuz birincil anahtır.Bunu belirtmek için entity sınıfımızda aşağıdaki gibi değişkenden önce veya get metodundan önce bunu belirtiriz.

@Id
private int idSparis;

 

  • @Table

Entity sınıfımız üzerinden haritalanan tablonun ismini belirtiğimiz dip nottur.Orm araçları buradaki etiketi alarak tablonun ismine vermektedir.Aşağıdaki gibi sınıftan haritalanacak olan tablonun isminin siparis olacağını belirttik.Mysql kullanıyorsanız büyük harfle yazsanız bile bunu küçük harfe,oracle ise küçük harfle yazsanız bile büyük harfe çevirecektir.

@Table(name="siparis")
public class Siparis implements Serializable {
...

 

  • @Transien

Bu dipnotun kullanıldığı değişken veritabanında ise tabloya karşılık gelecek olan alanın sınıfta var olacağı fakat tablo üzerinde bir kolona karşılık gelmeyeceği yanı tablo üzerinde bir kolonun oluşturulmaması gerektiğini belirtir.Yani bu dip nota sahip alan orm araçları tarafından görmezden gelinir.

@Transient
private String urunkoduSparis;
  • @Basic

Bu dipnotun kullanıldığı değişken veritabanında ise tabloya karşılık gelecek olan alanın mutlaka bulunması gerektiğini belirtmektedir.Kullanımı ise diğer dip notlara benzer şekildedir.

@Basic
private String urunadiSparis;

 

  • @Temporal

Bu dip not haritalanan kolunun bir tarih,saat tipinde olacağını yani zamana bağlı veri tiplerinde kullanırız.Farklı kullanım şekilleri vardır ve belirttiğiniz etiket ile sizin o değişkene atadığınız değeri belirttiğiniz formata çevirir.Örneği biz set metodu ile tarih ve saati verip,etiket olarak sadece tarih belirtirsek veritabanına veri tarih olarak kaydedilecektir.

@Temporal(TemporalType.DATE)
private Date satisTarihi;

/-------------------------------

@Temporal(TemporalType.TIME)
private Date satisTarihi;

 

  • @Lob

Large object olarak ifade edilir,yani büyük veri tipleri için kullanılır.Her veritabanı yönetim sisteminin farklı büyük veri tipleri vardır örneğin mysql longtext diye belirtirken oracle lob diyebilir işte Lob dipnotunu verdiğimizde orm araçları bunu veritabanına göre ayarlayarak o kolonu büyük veri olarak oluşturur.

@Lob
private String urunadiSparis;

 

  • @GeneratedValue

Tablolarda bulunan otomatik artan veya belirli kurallara göre veritabanı tarafından otomatik olarak verilen değerlere karşılık gelen dipnottur.Otomatik artan bir id değerimiz varsa bunu id değişkeninden önce bu dipnot ile belirtiriz.Kullanımı ise oldukça kolaydır,farklı parametreler alabilmektedir.

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int idSparis;
//idSparis verisini otomatik artan bir değer yaptık artık set metodu ile veri ataması yapmamıza gerek kalmıyor.
  • @TableGenerator

Otomatik artan değerlerde sistem tarafından oluşturulan id değerini tutmak için kullanılmaktadır.Bir sonraki oluşacak olan id değerini bir tablo oluşturarak saklayabilmektedir.Gerek ilişkisel tablolarda gerekse raporlama esnasında kullanılabilir.

@Id
@TableGenerator(name="yenitablo",table="TBLSONID")
@GeneratedValue(strategy=GenerationType.TABLE,generator="yenitablo")
private int idSparis;

 

  • @SecondaryTable

İlişkisel tablolar oluşturmak için kullanılır,bir entity(varlık) sınıfındaki verilerin birden fazla tablolarda tutulabilmesini sağlar.Örneğin bir sınıfımız var ve öğrenci bilgileri,notları,adresini,dersleri tutuyor fakat adres kolonunu biz farklı tabloda tutmak istiyoruz yani birden fazla adres olabileceğini düşünerek bir adres tablosu oluşturarak orada saklmak istiyoruz,bunun için SecondaryTable dipnotunu kullanıyoruz.

@Entity
@Table(name="siparis")//1.siparis tablomuz
@SecondaryTable(name="SparisAdresleri")//2.tablo
public class Siparis implements Serializable {
.....

@Column(table="SparisAdresleri")
private String siparisAdres;

//Column ile tablo ismini verdik ve adresler artık o tabloda tutulacaktır.

Oluşturulan diğer tablolarda ana tabloda bulunan id değeri de ilişki için diğer tablolara gönderilir.Yani ana tablodaki siparisid değeri olsa diğer tablolara da otomatik olarak bu id alanı eklenir ve değeri otomatik olarak verilir.

  • @Embedded – @Embeddable

Bir varlık (entity) sınıfı içerisinde haritalanacak olan alanların bir kısmını başka bir varlık sınıfı olmayan sınıftan almak istediğimizde kullanılır.Örneği bir varlık sınıfımız var ve personel bilgileri içeriyor bir adet ise normal sınıfımız var ve adres isminde adres alanları içeriyor,cadde,sokak,il,ilçe vs. bu sınıfı varlık sınıfı üzerindeymişcesine veritabanına haritalamak ve bu sınıf içerisinde kullanmak için oluşturulmuş bir diptnottur.Burada adres sınıfımızın üzerinde @Embeddable dipnotu gelir bunu kullanacağımız varlık sınıfında ise bu sınıf tanımlanarak başına @Embedded dipnotu gelir.

//Varlık (Entity) sınıfı
@Embedded
private Adres adres;
	
public Adres getAdres() {
return adres;
}

public void setAdres(Adres adres) {
this.adres = adres;
}

//Adres sınıfı
import javax.persistence.Embeddable;

@Embeddable
public class Adres {
....

 

  • @AttributeOverrides
  • @AttributeOverride
  • @ElementCollection
  • @JoinTable
  • @JoinColumn
  • @GenericGenerator
  • @CollectionId
  • @ElementCollection EAGER ve LAZY
  • @OneToOne