Hibernate Tek Yönlü(Unidirectional) @ManyToMany Kullanımı
14-11-2015@Entity public class Author { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") private int id; @Column(name="NAME") private String name; @Column(name="SURNAME") private String surname; @ManyToMany(cascade = CascadeType.ALL) @JoinTable( name="Author_Book", joinColumns = @JoinColumn( name="AuthorID"), inverseJoinColumns = @JoinColumn( name="BookID") ) private List<Book> books; } @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name="NAME") private String name; }
@JoinTable her iki tablonun primary key'lerini tutar. Bu annotasyonda joinColumns kısmı Book entity'nin DEĞİL, bulunduğu entity'in yani Author entity'nin PRIMARY KEY değerini, yani id değerini temsil eder. id değerleri veritabanında Author isimli tablonun ID isimli sütunda tutulur. Fakat @JoinColumn(name="AuthorID") diyerek, bu id değerinin, Author_Book tablosunun AuthorID isimli sütunda tutulmasını sağlarız. @JoinColumn(name="AuthorID") yerine istediğimiz sütun adını verebiliriz: @JoinColumn(name="adfsfmsdfmsaf"). Bu şekilde kullanıldığı zaman Author tablosunun primary key değerleri yani id değerleri Author_Book tablosundaki adfsfmsdfmsaf isimli sütunda tutulmuş olur.
Aynı mantıkla inverseJoinColumns = @JoinColumn( name="BookID")
Author_Book tablosunda Book entity'nin primary key değerlerinin yani id değerlerin BookID isimli sütunda tutulacağını ifade eder. Dikkat edersek Book entity içerisinde id değişkenine @Column annatasyonu kullanarak herhangi bir sütun ismi verilmedi. Bu durumda Book tablosu id isimli bir sütun ile primary key'leri tutmuş olur. @Column annotasyonundaki name property, istediğimiz sütun adını vermeyi sağlar. Bu annotasyon kullanılmadığı zaman sütun adı değişken adıyla aynı olur. Bundan dolayı Book tablosu aşağıdaki gibi olur:
id | NAME
cascade=Cascade.ALL
ifadesi hangi entity içerisinde kullanılmışsa, örneğimizde Author entity, o entity'i parent yapar! Diğer entity ise, örneğimizdeki Book child entity olur! Parent entity üzerinde hangi işlem yapılırsa, insert, update, delete, tüm bu işlemler cascade=Cascade.ALL
dediğimiz için child entity'de de yapılır!
Not: cascade hiç kullanılmamış olsaydı Author eklendiğinde Book eklenmezdi; fakat Author_Book tablosu güncellenirdi. Çünkü cascade sadece child entity, örneğimizdeki Book entity, üzerinde etki yapar.
Örnek olarak Insert işleminde aşağıdaki gibi sorgu çalışır:
insert into Author (ID,NAME,SURNAME) values (?, ?, ?) insert into Book (id, NAME) values (?, ?) insert into Author_Book (AuthorID, BookID) values (?, ?)