@OneToMany ve @ElementCollection arasındaki fark?


130

Her ikisi de bire çok ilişkisi üzerinde çalıştığı için a @OneToManyve @ElementCollectionek açıklama kullanmak arasındaki fark nedir ?


3
Özetle, @ElementCollection, alt varlığın varlığı ana varlık olmadan anlamsız olduğunda kullanılır, IOW, bir ana varlık kaldırıldığında, çocuklarınız da ...
dellasavia

1
Alt Varlık OLMADIĞINA inanıyorum, gömülü olan ve içinde bulunduğu ana Varlık olmadan varlığı daha az anlam ifade eden Değer Türü / Değer Nesnesidir.
CuriousMind

@CuriousMind ile aynı fikirdeyseniz, JPA'da bir 'Varlık'ın kendi yaşam döngüsü vardır.
mhrsalehi

Yanıtlar:


125

@ElementCollectionVarlıkları haritalamak için kullanılırken, esas olarak varlıkları haritalamak için (gömülebilir veya temel) olduğuna inanıyorum @OneToMany. Yani hangisinin kullanılacağı, elde etmek istediğiniz şeye bağlıdır.


1
Cevap için teşekkürler Peder! @OneToMany yalnızca varlıkları ilişkilendirebildiğinden, orada geçerli bir noktaya sahipsiniz.
n_g

157

ElementCollectionartık tescilli Hazırda Bekletme notuna göre tercih edilen standart bir JPA notudur CollectionOfElements.

Bu, koleksiyonun bir varlık koleksiyonu olmadığı, basit türlerin (Dizeler, vb.) Veya gömülebilir öğelerin bir koleksiyonunun (sınıfın açıklamalı olduğu @Embeddable) olduğu anlamına gelir.

Bu aynı zamanda, öğelerin tamamen içeren varlıklara ait olduğu anlamına gelir: varlık değiştirildiğinde değiştirilir, varlık silindiğinde silinir, vb. Kendi yaşam döngülerine sahip olamazlar.


... ve kendi başınıza sorgulayamazsınız.
Stuck

67

@ElementCollectionbasit veya katıştırılmış türle bire çok ilişki uygulamak istediğinizde kodu basitleştirmenize olanak tanır. Örneğin, JPA 1.0'da, bir e-posta listesiyle bire çok ilişkisine sahip olmak istediğinizde, sadece birincil anahtarı ve söz konusu olanı içeren Stringbasit bir POJO ( StringWrapper) varlığı oluşturmanız gerekiyordu String:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

JPA 2.0 ile şunları yazabilirsiniz:

@ElementCollection
private Collection<String> strings;

Daha basit, değil mi? @CollectionTableEk açıklamayı kullanarak tablo ve sütun adlarını yine de kontrol edebileceğinizi unutmayın .

Ayrıca bakınız:


Mantık için harika bir açıklama. :)
Phuah Yee Keat

4

Temel veya Gömülü : @ElementCollection
Varlıkları : @OneToMany veya @ManyToMany

@ElementCollection:

  • ilişki, (yalnızca) ilişkinin tanımlandığı varlık tarafından yönetilir
  • tablo, sahip olan varlığa kimlik referansı artı temel veya gömülü özellikleri içerir

@OneToMany / @ManyToMany:

  • diğer tüzel kişi tarafından da yönetilebilir
  • tablo veya sütun (lar) birleştirme genellikle yalnızca kimlik referansları içerir

1

@ElementCollectionbir koleksiyonu işaretler. Bu, bu koleksiyonun 1-n birleşimine başvurduğu anlamına gelmez.


1
Peki @ElementCollection'ın tam olarak amacı nedir?
n_g

0

ElementCollection, eşlemeleri veya koleksiyonu için tabloyu geçersiz kılabilir, böylece birden çok varlığın aynı Embeddable sınıfa başvurmasını sağlayabilir, ancak her birinin bağımlı nesnelerini ayrı bir tabloda depolamasını sağlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.