Perbedaan antara @OneToMany dan @ElementCollection?

129

Apa perbedaan antara menggunakan @OneToManydan @ElementCollectionanotasi karena keduanya bekerja pada hubungan satu-ke-banyak?

n_g
sumber
3
Singkatnya, @ElementCollection digunakan ketika keberadaan entitas anak tidak ada artinya tanpa entitas induk, TKI, setiap kali entitas induk dihapus, anak-anak Anda juga akan ...
dellasavia
1
Saya percaya itu BUKAN entitas anak, itu Jenis Nilai / Nilai Objek yang tertanam dan yang keberadaannya kurang berarti tanpa Entitas utama di mana ia terkandung.
CuriousMind
setuju dengan @CuriousMind, di JPA 'Entity' memiliki siklus hidupnya sendiri.
mhrsalehi

Jawaban:

124

Saya percaya @ElementCollectionini terutama untuk memetakan non-entitas (embeddable atau dasar) saat @OneToManydigunakan untuk memetakan entitas. Jadi yang mana yang akan digunakan tergantung pada apa yang ingin Anda capai.

TuanKiane
sumber
1
Terima kasih Peder untuk jawabannya! Anda memiliki titik yang valid di sana karena @OneToMany hanya dapat menghubungkan entitas.
n_g
157

ElementCollectionadalah anotasi JPA standar, yang sekarang lebih disukai daripada anotasi Hibernate eksklusif CollectionOfElements.

Ini berarti bahwa koleksi bukanlah kumpulan entitas, tetapi kumpulan tipe sederhana (String, dll.) Atau kumpulan elemen yang dapat diembed (kelas dengan penjelasan @Embeddable).

Ini juga berarti bahwa elemen sepenuhnya dimiliki oleh entitas yang mengandung: mereka dimodifikasi ketika entitas diubah, dihapus ketika entitas dihapus, dll. Mereka tidak dapat memiliki siklus hidup mereka sendiri.

JB Nizet
sumber
... dan Anda tidak dapat menanyakannya sendiri.
Terjebak
66

@ElementCollectionmemungkinkan Anda untuk menyederhanakan kode ketika Anda ingin menerapkan hubungan satu-ke-banyak dengan tipe sederhana atau tertanam. Misalnya di JPA 1.0 ketika Anda ingin memiliki hubungan satu-ke-banyak ke daftar String, Anda harus membuat entitas sederhana POJO ( StringWrapper) yang hanya berisi kunci utama dan Stringpertanyaan:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

Dengan JPA 2.0 Anda cukup menulis:

@ElementCollection
private Collection<String> strings;

Lebih sederhana, bukan? Perhatikan bahwa Anda masih dapat mengontrol nama tabel dan kolom menggunakan@CollectionTable anotasi.

Lihat juga:

Tomasz Nurkiewicz
sumber
Penjelasan bagus untuk alasannya. :)
Phuah Yee Keat
4

Dasar atau Tertanam : Entitas @ElementCollection
atau @ManyToMany

@ElementCollection:

  • relasi dikelola (hanya) oleh entitas tempat relasi didefinisikan
  • tabel berisi referensi id ke entitas yang memiliki ditambah atribut dasar atau tertanam

@OneToMany / @ManyToMany:

  • dapat juga dikelola oleh entitas lain
  • bergabung dengan tabel atau kolom biasanya hanya berisi referensi id
fidudidu
sumber
1

@ElementCollectionmenandai koleksi. Ini tidak berarti bahwa koleksi ini merujuk pada bergabungnya 1-n.

chzbrgla
sumber
1
Jadi apa sebenarnya tujuan dari @ElementCollection?
n_g
0

ElementCollection dapat mengesampingkan pemetaan, atau tabel untuk koleksi mereka, sehingga Anda dapat memiliki beberapa entitas referensi kelas Embeddable yang sama, tetapi masing-masing menyimpan objek bergantung mereka di tabel terpisah.

farshad-nsh
sumber