@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.

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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.