2 Ocak 2018 Salı

JPA @OneToMany Ilişki

Giriş
OneToMany unidirectional veya bidirectional olabilir. Bidirectional ilişki tercih edilmeli. Şeklen şöyle


1. Unidirectional
JPA OneToMany İlişki - Unidirectional yazısına taşıdım.

2. Bidirectional
JPA OneToMany İlişki - Bidirectional yazısına taşıdım.

3. Diğer Özellikler
Field ve Getter Method İle Kullanım Örnekleri
Örnek
@OneToMany genellikle field üzerine yazılır.Şöyle yaparız.
@Entity
public class Filter {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;
  private String name;
  @OneToMany
  @JoinColumn(name = "filter_id")
  private List<FilterComponents> filterComponenets;
}

@Entity    
public class FilterComponents {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;
  private int component_id;
  private int component_type;
  ...
}
Örnek
@OneToMany getter() metod ile de kullanıbilir. şöyle yaparız.
@Entity(name = "product")
@Table(name = "products", schema = "${DB_NAME}", catalog = "")
public class ProductEntity {
   ...
  private List shipments = new ArrayList<>();
  
  @OneToMany(mappedBy = "shipmentID", targetEntity=ShipmentEntity.class)
  @LazyCollection(LazyCollectionOption.FALSE)
  public Collection<ShipmentEntity> getShipments() { ... }
  public void setShipments(Collection<ShipmentEntity> shipments) { ... }
  ...

}
cascade Alanı
Çoğunlukla ALL seçeneği ile kullanılır. Parent nesneye yapılan insert,update,delete gibi işlemler child nesneleri de etkiler. cascade many nesneye konulur. Şöyle yaparız.
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name = "companyId")Company company;

fetch Alanı
Açıklaması şöyle.
For this relationship type, the default data loading method is LAZY: every time you ask for A, the B will not be retrieved.
FetchType - Lazy
Eğer FetchType tanımlı değilse LAZY olduğu varsayılır. İlişkinin many tarafını yüklemek için bir sürü SQL cümlesinin çalışmasına sebep olur.

FetchType - Eager
LAZY'den EAGER'a dönüş kolay ancak EAGER'dan LAZY'ye zor dönülüyor. EAGER şöyle tanımlanır.
@Entity
public class Person {

  @Column
  private String name;

  @OneToMany(fetch=FetchType.EAGER)
  private List<String> address;

}

Query query = EntityManager.createQuery("FROM Person person");
//list of person without the address list! But how???
List<Person> resultList = query.getResultList();
orphanRemoval Alanı
JPA orphanRemoval Alanı yazısına taşıdım.

targetEntity  Alanı
Açıklaması şöyle.
If the collection is defined using generics to specify the element type, the associated target entity type need not be specified; otherwise the target entity class must be specified.
Örnek
Normalde şöyle yaparız.
@OneToMany(mappedBy = "user")
private List<Vote> votes;
Eğer generic tip kullanmıyorsak şöyle yaparız.


@OneToMany(targetEntity=logic.Vote.class, mappedBy = "user")
private List votes;

Hiç yorum yok:

Yorum Gönder