@OneToMany Listesi <> - Set <> farkı


96

Kullanırsam herhangi bir fark var mı

@OneToMany
public Set<Rating> ratings;

ya da kullanırsam

@OneToMany
public List<Rating> ratings;

her ikisi de iyi çalışıyor, liste ile bir küme arasındaki farkı biliyorum, ancak bunun hazırda bekletme (veya daha doğrusu JPA 2.0) ile nasıl başa çıktığı konusunda herhangi bir fark yaratıp yaratmadığını bilmiyorum.

Yanıtlar:


112

Bir liste, belirtilmiş bir dizin sütunu yoksa, Hazırda Bekletme tarafından bir torba olarak işlenecektir (belirli bir sıralama yoktur).

Hazırda Bekletme'nin işlenmesindeki dikkate değer bir fark, tek bir sorguda iki farklı listeyi getirememenizdir. Örneğin, bir Personkişi listesine ve bir adres listesine sahip bir varlığınız varsa , kişileri tüm kişileri ve tüm adresleriyle yüklemek için tek bir sorgu kullanamazsınız. Bu durumda çözüm, iki sorgu yapmak (kartezyen ürünü ortadan kaldırır) veya koleksiyonlardan en az biri için a Setyerine a kullanmaktır List.

Varlıkları tanımlamanız equalsve hashCodeüzerinde tutmanız gerektiğinde ve varlıkta değişmez bir işlevsel anahtarınız yoksa Hazırda Bekletme ile Setleri kullanmak genellikle zordur .


3
Ve bir listeyle ilgili ayrıntılar için stackoverflow.com/q/1995080/2495717 adresine bakın .
ben3000

31

Bir Liste kullanıyorsanız, getter işlevinde bir 'Order BY' cümlesi belirtebilirsiniz. Bunu bir Set ile yapamazsınız. Siparişe göre cümlede kısmi EJBQL bulunabilir; Örneğin

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

Bu alanı boş bırakırsanız, liste birincil anahtarın değerine göre artan sırada sıralanır.


19
Beni Hazırda Bekletme belgelerimi karıştırmaya gönderdiğinden: bir set yapabilirsiniz @Sort - sadece belgelerdeSortedSet açıklandığı gibi kullanın .
mabi

ancak SortedSet kullanırsanız, karşılaştırıcıyla sıralar, onu veritabanının "sıralama ölçütü" ne göre sıralamanın bir yolu yoktur.
samir105

1
Eski cevap olduğu için açıklığa kavuşturmak isterim. Şu anda kullanmak CAN @OrderByüzerinde Set. Bunun altında, Hibernate a'yı başlatacak OrderedSetTypeolanı kullanacaktır LinkedHashSet, bu nedenle düzen korunur. Ek olarak LinkedHashSet, tutarlılık uğruna varlık içinde kullanmanızı öneririm . Kaynak: discourse.hibernate.org/t/…
Martin
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.