ความแตกต่างระหว่าง @OneToMany และ @ElementCollection


130

อะไรคือความแตกต่างระหว่างการใช้ a @OneToManyและ@ElementCollectionคำอธิบายประกอบเนื่องจากทั้งสองทำงานกับความสัมพันธ์แบบหนึ่งต่อกลุ่ม


3
โดยสรุป @ElementCollection ใช้เมื่อการมีอยู่ของเอนทิตีลูกไม่มีความหมายหากไม่มีเอนทิตีหลัก IOW เมื่อใดก็ตามที่เอนทิตีหลักถูกลบ
ออกลูก

1
ฉันเชื่อว่ามันไม่ใช่เอนทิตีลูกเป็น Value Type / Value Object ที่ฝังอยู่และการดำรงอยู่นั้นมีความหมายน้อยกว่าโดยไม่มีเอนทิตีหลักที่มีอยู่
CuriousMind

เห็นด้วยกับ @CuriousMind ใน JPA 'Entity' มีวงจรชีวิตของตัวเอง
mhrsalehi

คำตอบ:


125

ฉันเชื่อว่า@ElementCollectionเป็นส่วนใหญ่สำหรับการแมปเอนทิตีที่ไม่ใช่เอนทิตี (ฝังได้หรือพื้นฐาน) ในขณะที่@OneToManyใช้เพื่อแมปเอนทิตี ดังนั้นจะใช้อันไหนขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ


1
ขอบคุณ Peder สำหรับคำตอบ! คุณมีจุดที่ถูกต้องเนื่องจาก @OneToMany สามารถเชื่อมโยงเอนทิตีได้เท่านั้น
n_g

157

ElementCollectionเป็นคำอธิบายประกอบ JPA มาตรฐานซึ่งเป็นที่ต้องการในขณะนี้มากกว่ากรรมสิทธิ์ Hibernate CollectionOfElementsคำอธิบายประกอบ

หมายความว่าคอลเลกชันไม่ใช่คอลเล็กชันของเอนทิตี แต่เป็นคอลเล็กชันประเภทธรรมดา (สตริง ฯลฯ ) หรือคอลเล็กชันขององค์ประกอบที่ฝังได้ (คลาสที่มีคำอธิบายประกอบ@Embeddable)

นอกจากนี้ยังหมายความว่าองค์ประกอบนั้นเป็นของเอนทิตีที่มีอยู่โดยสมบูรณ์: จะแก้ไขเมื่อเอนทิตีถูกแก้ไขลบเมื่อเอนทิตีถูกลบ ฯลฯ องค์ประกอบเหล่านี้ไม่สามารถมีวงจรชีวิตของตนเองได้


... และคุณไม่สามารถสอบถามได้ด้วยตัวเอง
ติด

68

@ElementCollectionช่วยให้คุณลดความซับซ้อนของโค้ดเมื่อคุณต้องการใช้ความสัมพันธ์แบบหนึ่งต่อกลุ่มกับประเภทที่เรียบง่ายหรือแบบฝัง ตัวอย่างเช่นใน JPA 1.0 เมื่อคุณต้องการมีความสัมพันธ์แบบหนึ่งต่อกลุ่มกับรายการStrings คุณต้องสร้างเอนทิตีแบบง่าย POJO ( StringWrapper) ที่มีเฉพาะคีย์หลักและStringคำถามที่เป็นปัญหา:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

ด้วย JPA 2.0 คุณสามารถเขียน:

@ElementCollection
private Collection<String> strings;

ง่ายกว่านี้ไม่ใช่เหรอ? โปรดทราบว่าคุณยังสามารถควบคุมชื่อตารางและคอลัมน์ได้โดยใช้@CollectionTableคำอธิบายประกอบ

ดูสิ่งนี้ด้วย:


คำอธิบายที่ดีสำหรับการให้เหตุผล :)
Phuah Yee Keat

4

Basic หรือ Embedded : @ElementCollection
Entities : @OneToMany หรือ @ManyToMany

@ElementCollection:

  • ความสัมพันธ์ถูกจัดการ (เท่านั้น) โดยเอนทิตีที่กำหนดความสัมพันธ์
  • ตารางมีการอ้างอิง id ไปยังเอนทิตีที่เป็นเจ้าของบวกกับแอตทริบิวต์พื้นฐานหรือแบบฝัง

@OneToMany / @ManyToMany:

  • นอกจากนี้ยังสามารถจัดการโดยนิติบุคคลอื่น
  • ตารางหรือคอลัมน์เข้าร่วมโดยทั่วไปจะมีการอ้างอิง ID เท่านั้น

1

@ElementCollectionทำเครื่องหมายคอลเลกชัน นี่ไม่ได้หมายความว่าคอลเล็กชันนี้อ้างอิงการเข้าร่วม 1-n


1
แล้วจุดประสงค์ของ @ElementCollection คืออะไร?
n_g

0

ElementCollection สามารถแทนที่การแมปหรือตารางสำหรับคอลเลกชันดังนั้นคุณสามารถมีเอนทิตีหลายรายการอ้างอิงคลาส Embeddable เดียวกัน แต่มีแต่ละอ็อบเจ็กต์ที่ขึ้นต่อกันในตารางแยกกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.