@OneToMany List <> vs Set <> perbedaan

95

Apakah ada perbedaan jika saya menggunakan

@OneToMany
public Set<Rating> ratings;

atau jika saya gunakan

@OneToMany
public List<Rating> ratings;

keduanya berfungsi OK, saya tahu perbedaan antara daftar dan satu set, namun saya tidak tahu apakah ini ada bedanya bagaimana hibernate (atau lebih tepatnya JPA 2.0) menanganinya.

M4ks
sumber

Jawaban:

111

Sebuah daftar, jika tidak ada kolom indeks yang ditentukan, hanya akan ditangani sebagai tas oleh Hibernate (tidak ada pemesanan khusus).

Satu perbedaan penting dalam penanganan Hibernate adalah Anda tidak dapat mengambil dua daftar berbeda dalam satu kueri. Misalnya, jika Anda memiliki Personentitas yang memiliki daftar kontak dan daftar alamat, Anda tidak akan dapat menggunakan satu kueri untuk memuat orang dengan semua kontak dan semua alamatnya. Solusi dalam kasus ini adalah membuat dua kueri (yang menghindari produk kartesius), atau menggunakan a Setalih - alih a Listuntuk setidaknya salah satu koleksi.

Seringkali sulit untuk menggunakan Set dengan Hibernate ketika Anda harus menentukan equalsdan hashCodepada entitas dan tidak memiliki kunci fungsional yang tidak dapat diubah dalam entitas.

JB Nizet
sumber
3
Dan untuk detail tentang apa yang terjadi dengan daftar, lihat stackoverflow.com/q/1995080/2495717 .
ben3000
31

Jika Anda menggunakan List, maka Anda dapat menentukan klausa 'Order BY' dalam fungsi pengambil. Anda tidak dapat melakukan itu dengan Set. Urutan menurut klausul dapat berisi sebagian EJBQL; Sebagai contoh

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

Jika Anda membiarkan bidang ini kosong, daftar diurutkan dalam urutan menaik berdasarkan nilai kunci utama.

Basanth Roy
sumber
19
Karena itu mengirim saya berebut untuk dokumen Hibernate saya: Anda bisa @Sort satu set - gunakan saja SortedSetseperti yang dijelaskan di dokumen .
mabi
tetapi jika Anda menggunakan SortedSet, ini diurutkan dengan pembanding, tidak ada cara untuk membuatnya diurutkan berdasarkan "urutan berdasarkan" database.
samir105
Karena ini adalah jawaban lama, saya ingin menjelaskannya. Saat ini kami BISA menggunakan @OrderBypada Set. Di bawahnya, Hibernate akan digunakan OrderedSetTypeyang akan membuat instance LinkedHashSet, jadi ketertiban tetap terjaga. Selain itu saya akan menyarankan untuk digunakan LinkedHashSetdalam entitas - demi konsistensi. Sumber: Discse.hibernate.org/t/…
Martin