Hibernate ManyToMany ve JoinColumns Annotasyonlarının Kullanımı
11-03-2015Problem sınıfı:
/** * User tablosu sabit oldugu icin cascade kullanilmadi. Veritabanina yeni bir Problem eklenince otomatik olarak * Problem_User tablosuna da bu veri eklenecektir. cascade kullansaydık aynı zamanda User tablosuna da var olan Tag'i * eklemeye calisacakti. Bu nedenle kullanilmadi */ @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "Problem_User", joinColumns = @JoinColumn(name = "problemId",nullable = false, updatable = false), inverseJoinColumns = @JoinColumn(name = "userId", nullable = false, updatable = false) ) private List<User> userList;
@JoinTable annotasyonu owned entity içerisinde kullanılır. Örnekteki owned entity Problem sınıfıdır. Bundan dolayı Problem entity ilişkiyi yönetir. Yeni bir Problem eklendiğinde otomatik olarak @JoinTable ile belirtilen Problem_User tablosu da güncellenir.
Eğer @ManyToMany annotasyonunda cascade=CascadeType.PERSIST
şeklinde bir kullanım olsaydı, Problem eklendiğinde User tablosuna da yeni bir User entity eklenmeye çalışılırdı. Fakat bu uygulamada User tablosundaki veriler sabit olduğu için ve yeni kullanıcı eklemediğimiz için cascade kullanılmadı.
joinColumns property owned entity'yi temsil eder. Yani foreign key sütunlarını belirtiriz.
inverseJoinColumns ise ,inversed entity'i temsil eder.
User Sınıfı:
@ManyToMany(fetch = FetchType.LAZY,mappedBy = "userList") private List<Problem> problemList;
mappedBy property owned olmayan entity içinde yani User entity içerisinde kullanılır. Çünkü mappedBy'ın aldığı değer owned entity içerisinde tanımlanan field'e referans eder.