17 Ekim 2018 Çarşamba

JPA @JoinColumn Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.persistence.JoinColumn;
Açıklaması şöyle.
The attributes in @JoinColumn are the names of the database table column.
Açıklaması şöyle.
The join column is declared with the @JoinColumn annotation which looks like the @Column annotation. It has one more parameters named referencedColumnName. This parameter declares the column in the targeted entity that will be used to the join. Note that when using referencedColumnName to a non primary key column, the associated class has to be Serializable. Also note that the referencedColumnName to a non primary key column has to be mapped to a property having a single column (other cases might not work).
ManyToOne, OneToMany, OneToOne anotasyonları ile birlikte kullanılır.

Normalde bidirectional (çift yönlü) OneToMany ilişkide A tablosu, B tablosu ve A_B join tablosu üretilir. Bu durumda @JoinColumn anotasyonu name + joinColumns + inverseJoinColumns alanları doldurularak kullanılır.

Eğer unidirectional (tek yönlü) OneToMany ilişki istiyorsak yani A tablosu, B tablosu yaratılır ve B tablosuna A_ID şeklinde parent için foreign key yerleştirilir. Bu durumda @JoinColumn anotasyonu sadece name + joinColumns alanları doldurularak kullanılır. Açıklaması burada.

name Alanı
Sütun ismini belirtir.

Örnek
Unidirectional OneToMany ilişkide child tablodaki parent tabloya foreign key olan sütun ismi yazılır. Şöyle yaparız.
@OneToMany
@JoinColumn(name="A_ID")
private List<C> cList;
Örnek
ManyToOne ilişkide child sınıfta şöyle yaparız. Child tablodaki parent tabloya foreign key olan sütun ismi yazılır.
@ManyToOne
@JoinColumn(name="parent_fk")
private DomainObject domainObject;
Örnek
ManyToOne ilişkide child sınıfta şöyle yaparız. Child tablodaki parent tabloya foreign key olan sütun ismi yazılır.
class customer {

  @Id
  private Long id;
  private String name;
  private Company company;
}

class Company {

  @Id
  private Long id;
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "ownedBy")
  private Company ownedBy;
}
Örnek - Sütün İsmi Yoksa
Eğer sütun ismi tanımlanmazsa şu isim kullanılır.
<field_name>_<id_column_name>
Yani aşağaki örnekte Address sınıfı için "field_name" address "id_column_name" ise id kabul edilir ve sütun ismi address_id olur.
@ManyToOne
@JoinColumn
public Address getAddress() { 
    return address; 
}
referenceColumnName Alanı
Örnek
ManyToOne ilişkide child sınıfta parent tablodaki sütunu belirtmek için şöyle yaparız
@JoinColumn(name="domain_object_id",referenceColumnName="domain_id")

Hiç yorum yok:

Yorum Gönder