@OneToMany List <> vs Set <> ความแตกต่าง


98

มีความแตกต่างหรือไม่ถ้าฉันใช้

@OneToMany
public Set<Rating> ratings;

หรือถ้าฉันใช้

@OneToMany
public List<Rating> ratings;

ทั้งคู่ทำงานได้ดีฉันรู้ความแตกต่างระหว่างรายการและชุด แต่ฉันไม่รู้ว่าสิ่งนี้สร้างความแตกต่างหรือไม่ว่าไฮเบอร์เนต (หรือค่อนข้าง JPA 2.0) จัดการกับมันอย่างไร

คำตอบ:


113

รายการหากไม่ได้ระบุคอลัมน์ดัชนีจะถูกจัดการเป็นกระเป๋าโดย Hibernate (ไม่มีการสั่งซื้อเฉพาะ)

ความแตกต่างที่น่าสังเกตอย่างหนึ่งในการจัดการ Hibernate คือคุณไม่สามารถดึงข้อมูลสองรายการที่แตกต่างกันในแบบสอบถามเดียวได้ ตัวอย่างเช่นหากคุณมีPersonหน่วยงานที่มีรายชื่อผู้ติดต่อและรายการที่อยู่คุณจะไม่สามารถใช้แบบสอบถามเดียวเพื่อโหลดบุคคลที่มีรายชื่อติดต่อทั้งหมดและที่อยู่ทั้งหมดของพวกเขา วิธีแก้ปัญหาในกรณีนี้คือการสร้างแบบสอบถามสองรายการ (ซึ่งหลีกเลี่ยงผลิตภัณฑ์คาร์ทีเซียน) หรือใช้ a SetแทนListคอลเลกชันอย่างน้อยหนึ่งรายการ

มักจะใช้ชุดกับไฮเบอร์เนตได้ยากเมื่อคุณต้องกำหนดequalsและhashCodeบนเอนทิตีและไม่มีคีย์การทำงานที่ไม่เปลี่ยนรูปในเอนทิตี


3
และสำหรับรายละเอียดของสิ่งที่เกิดขึ้นกับรายการให้ดูstackoverflow.com/q/1995080/2495717
ben3000

31

หากคุณใช้รายการคุณสามารถระบุส่วนคำสั่ง 'Order BY' ในฟังก์ชัน getter คุณไม่สามารถทำได้ด้วยชุด ลำดับตามข้อสามารถมี EJBQL บางส่วน ตัวอย่างเช่น

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

หากคุณปล่อยให้ฟิลด์นี้ว่างรายการจะเรียงลำดับจากน้อยไปมากตามค่าของคีย์หลัก


19
เพราะมันส่งฉัน scrambling สำหรับเอกสาร Hibernate ของฉัน: คุณสามารถ @Sortตั้งค่า - เพียงแค่ใช้SortedSetตามที่อธิบายไว้ในเอกสาร
mabi

แต่ถ้าคุณใช้ SortedSet มันจะเรียงลำดับด้วยตัวเปรียบเทียบไม่มีวิธีใดที่จะเรียงลำดับตาม "ลำดับโดย" ของฐานข้อมูล
samir105

1
เนื่องจากเป็นคำตอบเก่าจึงขอชี้แจง ขณะนี้เราสามารถใช้ใน@OrderBy Setด้านล่างไฮเบอร์เนตจะใช้OrderedSetTypeซึ่งจะสร้างอินสแตนซ์ a LinkedHashSetดังนั้นคำสั่งจึงถูกสงวนไว้ นอกจากนี้ฉันขอแนะนำให้ใช้LinkedHashSetในเอนทิตี - เพื่อความสอดคล้อง ที่มา: discourse.hibernate.org/t/…
Martin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.