Java Persistence / JPA: @Column vs @Basic


119

ความแตกต่างระหว่างคืออะไร@Columnและ@Basicคำอธิบายประกอบใน JPA? สามารถใช้ร่วมกันได้หรือไม่? ควรใช้ร่วมกันหรือไม่? หรือหนึ่งในนั้นพอเพียง?

คำตอบ:


147
  • @Basicหมายความว่าแอตทริบิวต์จะยังคงอยู่และจะใช้การแม็ปมาตรฐาน มีพารามิเตอร์ที่ช่วยให้คุณระบุได้ว่าจะโหลดแอตทริบิวต์อย่างเกียจคร้านหรือไม่และเป็นโมฆะหรือไม่

  • @Column อนุญาตให้คุณระบุชื่อของคอลัมน์ในฐานข้อมูลที่จะคงคุณสมบัติไว้

หากคุณระบุอย่างใดอย่างหนึ่งโดยไม่มีอีกอย่างคุณจะได้รับพฤติกรรมเริ่มต้นที่สมเหตุสมผลดังนั้นคนทั่วไปจึงใช้เพียงอย่างเดียวยกเว้นกรณีพิเศษ

ดังนั้นหากเราต้องการโหลดแอตทริบิวต์และระบุชื่อคอลัมน์เราสามารถพูดได้

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

หากเราไม่ต้องการค่าเริ่มต้นพฤติกรรมที่ไม่เกียจคร้านสิ่งนั้นก็@Columnเพียงพอแล้ว


2
นี่คือคำตอบที่ชัดเจน ขอบคุณ. ดังนั้นฉันถือว่าหนึ่งสามารถใช้ได้@Basicโดยไม่ต้อง@Columnด้วยเหตุนี้optionalและnullableคุณสมบัติจึงมีอยู่ในทั้งสองอย่าง ฉันถูกไหม?
Hosam Aly

1
ฉันไม่ได้อ้างว่าเข้าใจข้อมูลจำเพาะ JPA อย่างถ่องแท้เกี่ยวกับความแตกต่างระหว่างโมฆะของ @ Basic และ @ Column ที่เป็นโมฆะและผลของการไม่ระบุอย่างใดอย่างหนึ่งหรือทั้งสองอย่าง @Basic nullable ถูกอธิบายว่าเป็น "คำใบ้" ที่เกี่ยวข้องกับการสร้างสคีมา @Column nullable อธิบายว่าเป็นการกำหนดลักษณะของคอลัมน์ในฐานข้อมูล แนวทางปฏิบัติของฉันคือการใช้กรณี @ คอลัมน์
djna

16
@Basic (ทางเลือก) คือ (ควร) ตรวจสอบรันไทม์โดยผู้ให้บริการการคงอยู่ก่อนบันทึกลงใน DB @Column เป็นนิยามคอลัมน์ในฐานข้อมูลและใช้สำหรับการสร้างสคีมา: stackoverflow.com/questions/2899073/…
Piotr Gwiazda

2
ที่ 'ไม่ขี้เกียจ' เรียก EAGER LOL
solvator

7
คำอธิบายประกอบ JPA สามารถแบ่งออกได้เป็นสองกลุ่ม: คำอธิบายประกอบเชิงสัมพันธ์ที่บริสุทธิ์กับคำอธิบายประกอบการนำไปใช้งาน คำอธิบายประกอบเชิงสัมพันธ์ที่บริสุทธิ์ประกอบด้วย: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... ในขณะที่คำอธิบายประกอบการใช้งานจะให้เบาะแสเกี่ยวกับวิธีการแมปแบบจำลองทางทฤษฎีที่บริสุทธิ์กับฐานข้อมูลจริง: ตารางคอลัมน์ ... ในคำถามของคุณ 'พื้นฐาน "เป็นคำอธิบายประกอบเพื่อให้ข้อมูลเกี่ยวกับแอตทริบิวต์เอนทิตีเชิงสัมพันธ์ในขณะที่" คอลัมน์ "ให้ข้อมูลเกี่ยวกับวิธีการแมปกับคอลัมน์ฐานข้อมูล
Bruno Ranschaert

50

นอกจากนี้ในการตอบ @ djna ของมันเป็นที่น่าสังเกตว่า@Basicควรจะเทียบกับ@OneToMany, และ@ManyToOne @ManyToManyสามารถระบุได้เพียงรายการเดียวในคุณสมบัติใด ๆ

@Columnและ@JoinColumnสามารถระบุพร้อมกับสิ่งเหล่านี้เพื่ออธิบายคุณสมบัติคอลัมน์ฐานข้อมูล

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


21

เป็นที่น่าสังเกตว่า Basic ได้รับการออกแบบมาสำหรับฟิลด์ดั้งเดิม

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

แอตทริบิวต์พื้นฐานคือแอตทริบิวต์ที่คลาสแอตทริบิวต์เป็นประเภทพื้นฐานเช่น String, Number, Date หรือ primitive ค่าแอตทริบิวต์พื้นฐานสามารถแมปโดยตรงกับค่าคอลัมน์ในฐานข้อมูล

ประเภทและการแปลงที่รองรับขึ้นอยู่กับการใช้งาน JPA และแพลตฟอร์มฐานข้อมูล แอ็ตทริบิวต์พื้นฐานใด ๆ ที่ใช้ชนิดที่ไม่ได้แม็พโดยตรงกับประเภทฐานข้อมูลสามารถต่ออนุกรมกับประเภทฐานข้อมูลไบนารีได้

วิธีที่ง่ายที่สุดในการแมปแอตทริบิวต์พื้นฐานใน JPA คือไม่ต้องทำอะไรเลย แอตทริบิวต์ใด ๆ ที่ไม่มีคำอธิบายประกอบอื่น ๆ และไม่ได้อ้างอิงเอนทิตีอื่น ๆ จะถูกแมปโดยอัตโนมัติเป็นพื้นฐานและจะทำให้เป็นอนุกรมได้หากไม่ใช่ประเภทพื้นฐาน ชื่อคอลัมน์สำหรับแอตทริบิวต์จะเป็นค่าเริ่มต้นโดยตั้งชื่อเหมือนกับชื่อแอตทริบิวต์เป็นตัวพิมพ์ใหญ่


หมายเหตุที่ดี ขอบคุณ.
Hosam Aly

1
ไม่ถ้าไม่ได้ระบุคำอธิบายประกอบคอลัมน์จะใช้ค่าเริ่มต้น (ชื่อจะเป็นแอตทริบิวต์หนึ่ง)
Gab

2

คำอธิบายประกอบ @Basic ถูกนำไปใช้กับเอนทิตี JPA และของ @Column ถูกนำไปใช้กับแอตทริบิวต์เสริมของคอลัมน์ฐานข้อมูล @Basic annotation กำหนดว่าฟิลด์เอนทิตีสามารถเป็นค่าว่างได้หรือไม่ ในทางกลับกัน,

  • แอตทริบิวต์ nullable ของคำอธิบายประกอบ @Column ระบุว่าคอลัมน์ฐานข้อมูลที่เกี่ยวข้องสามารถเป็นค่าว่างได้หรือไม่
  • เราสามารถใช้ @Basic เพื่อระบุว่าควรโหลดฟิลด์อย่างไม่ตั้งใจ
  • คำอธิบายประกอบ @Column ช่วยให้เราระบุชื่อของคอลัมน์ฐานข้อมูลที่แมป
  • คำอธิบายประกอบ @Basic ทำเครื่องหมายคุณสมบัติว่าไม่ใช่ทางเลือกในระดับวัตถุ Java และ (nullable = false) บนการแมปคอลัมน์มีหน้าที่ในการสร้างข้อ จำกัด ฐานข้อมูล NOT NULL เท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.