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
        (?, ?)

© 2019 Tüm Hakları Saklıdır. Codesenior.COM