อะไรคือความแตกต่างระหว่างการใช้ a @OneToMany
และ@ElementCollection
คำอธิบายประกอบเนื่องจากทั้งสองทำงานกับความสัมพันธ์แบบหนึ่งต่อกลุ่ม
อะไรคือความแตกต่างระหว่างการใช้ a @OneToMany
และ@ElementCollection
คำอธิบายประกอบเนื่องจากทั้งสองทำงานกับความสัมพันธ์แบบหนึ่งต่อกลุ่ม
คำตอบ:
ฉันเชื่อว่า@ElementCollection
เป็นส่วนใหญ่สำหรับการแมปเอนทิตีที่ไม่ใช่เอนทิตี (ฝังได้หรือพื้นฐาน) ในขณะที่@OneToMany
ใช้เพื่อแมปเอนทิตี ดังนั้นจะใช้อันไหนขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ
ElementCollection
เป็นคำอธิบายประกอบ JPA มาตรฐานซึ่งเป็นที่ต้องการในขณะนี้มากกว่ากรรมสิทธิ์ Hibernate CollectionOfElements
คำอธิบายประกอบ
หมายความว่าคอลเลกชันไม่ใช่คอลเล็กชันของเอนทิตี แต่เป็นคอลเล็กชันประเภทธรรมดา (สตริง ฯลฯ ) หรือคอลเล็กชันขององค์ประกอบที่ฝังได้ (คลาสที่มีคำอธิบายประกอบ@Embeddable
)
นอกจากนี้ยังหมายความว่าองค์ประกอบนั้นเป็นของเอนทิตีที่มีอยู่โดยสมบูรณ์: จะแก้ไขเมื่อเอนทิตีถูกแก้ไขลบเมื่อเอนทิตีถูกลบ ฯลฯ องค์ประกอบเหล่านี้ไม่สามารถมีวงจรชีวิตของตนเองได้
@ElementCollection
ช่วยให้คุณลดความซับซ้อนของโค้ดเมื่อคุณต้องการใช้ความสัมพันธ์แบบหนึ่งต่อกลุ่มกับประเภทที่เรียบง่ายหรือแบบฝัง ตัวอย่างเช่นใน JPA 1.0 เมื่อคุณต้องการมีความสัมพันธ์แบบหนึ่งต่อกลุ่มกับรายการString
s คุณต้องสร้างเอนทิตีแบบง่าย 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
คำอธิบายประกอบ
Basic หรือ Embedded : @ElementCollection
Entities : @OneToMany หรือ @ManyToMany
@ElementCollection:
@OneToMany / @ManyToMany:
@ElementCollection
ทำเครื่องหมายคอลเลกชัน นี่ไม่ได้หมายความว่าคอลเล็กชันนี้อ้างอิงการเข้าร่วม 1-n
ElementCollection สามารถแทนที่การแมปหรือตารางสำหรับคอลเลกชันดังนั้นคุณสามารถมีเอนทิตีหลายรายการอ้างอิงคลาส Embeddable เดียวกัน แต่มีแต่ละอ็อบเจ็กต์ที่ขึ้นต่อกันในตารางแยกกัน