อะไรคือความแตกต่างระหว่าง@Basic(optional = false)
และ@Column(nullable = false)
ความคงอยู่ของ JPA?
อะไรคือความแตกต่างระหว่าง@Basic(optional = false)
และ@Column(nullable = false)
ความคงอยู่ของ JPA?
คำตอบ:
Gordon Yorke (สมาชิกคณะกรรมการสถาปัตยกรรม EclipseLink, หัวหน้าฝ่ายเทคนิคของ TopLink, สมาชิกกลุ่มผู้เชี่ยวชาญ JPA 2.0) เขียนคำตอบที่ดีในหัวข้อนี้ดังนั้นแทนที่จะถอดความเขาฉันจะพูดคำตอบของเขา :
ความแตกต่างระหว่าง
optional
และnullable
เป็นขอบเขตที่มีการประเมิน คำจำกัดความของ 'optional
' พูดถึงคุณสมบัติและค่าฟิลด์และแนะนำว่าควรประเมินคุณสมบัตินี้ภายในรันไทม์ 'nullable
' อ้างอิงถึงคอลัมน์ฐานข้อมูลเท่านั้นหาก Chooses การดำเนินงานในการดำเนินการ
optional
แล้วคุณสมบัติเหล่านั้นควรได้รับการประเมินในหน่วยความจำโดยผู้ให้ความคงทนและข้อยกเว้นยกก่อน SQL จะถูกส่งไปยังฐานข้อมูลเป็นอย่างอื่นเมื่อใช้ 'updatable=false
' 'optional
' ละเมิดจะไม่ได้รับการรายงาน
@Basic(optional = false) @Column(nullable = false)
คำอธิบายประกอบ @Basic ทำเครื่องหมายคุณสมบัติว่าไม่ใช่ทางเลือกในระดับวัตถุ Java การตั้งค่าที่สอง nullable = false บนการแมปคอลัมน์มีหน้าที่ในการสร้างข้อ จำกัด ฐานข้อมูล NOT NULL เท่านั้น การใช้งาน Hibernate JPA จะปฏิบัติต่อตัวเลือกทั้งสองในลักษณะเดียวกันไม่ว่าในกรณีใด ๆ ดังนั้นคุณอาจใช้คำอธิบายประกอบเพียงรายการเดียวเพื่อจุดประสงค์นี้
The @Basic annotation marks the property as not optional on the Java object level.
ว่าหมายความว่าอย่างไร? ดังนั้นจึง@Basic
เป็นเพียงการบอกว่าสร้างคอลัมน์ฐานข้อมูลNOT NULL
สำหรับตัวแปรดังกล่าว?
ดังนั้นฉันจึงลองใช้คำอธิบายประกอบ @Basic (ทางเลือก = เท็จ) โดยใช้ JPA 2.1 (EclipseLink) และปรากฎว่าคำอธิบายประกอบถูกละเว้นในการใช้งานจริง (อย่างน้อยสำหรับฟิลด์สตริง) (เช่นการเรียก entityManager.persist)
ดังนั้นฉันจึงไปที่ข้อกำหนดและอ่านเกี่ยวกับเรื่องนี้ นี่คือสิ่งที่ระบุข้อมูลจำเพาะ:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
พื้นฐาน (ทางเลือก): ค่าของฟิลด์หรือคุณสมบัติอาจเป็นโมฆะ นี่เป็นคำใบ้และไม่คำนึงถึงประเภทดั้งเดิม อาจใช้ในการสร้างสคีมา
ดังนั้นฉันคิดว่าประโยคนี้อธิบายถึงกรณีการใช้งานจริงสำหรับ Basic (ทางเลือก) ที่ใช้ในการสร้างสคีมา (นั่นคือ: เมื่อคุณสร้าง CREATE TABLE SQL จากคลาส Java Entity นี่คือสิ่งที่ Hibernate สามารถทำได้)
optional = false
ใช้สำหรับตรวจสอบข้อ จำกัด นี้ในรันไทม์เท่านั้น nullable = false
สร้างข้อ จำกัด ของฐานข้อมูล สำหรับแอปพลิเคชันการตั้งค่าก็optional = false
สมเหตุสมผลเพราะจะได้รับการประเมินเร็วกว่าการไปที่ฐานข้อมูลและตรวจสอบข้อ จำกัด ที่นั่น ..