@Basic (ตัวเลือก = เท็จ) เทียบกับ @ คอลัมน์ (nullable = false) ใน JPA


103

อะไรคือความแตกต่างระหว่าง@Basic(optional = false)และ@Column(nullable = false)ความคงอยู่ของ JPA?



14
ไม่ใช่เรื่องที่ซ้ำกันจริงๆคำถามคือเพิ่มเติมเกี่ยวกับคุณลักษณะไม่ใช่คำอธิบายประกอบ
Pascal Thivent

อาจจะช่วยได้มากกว่า stackoverflow.com/a/59497054/6191407
Sonu patel

คำตอบ:


98

Gordon Yorke (สมาชิกคณะกรรมการสถาปัตยกรรม EclipseLink, หัวหน้าฝ่ายเทคนิคของ TopLink, สมาชิกกลุ่มผู้เชี่ยวชาญ JPA 2.0) เขียนคำตอบที่ดีในหัวข้อนี้ดังนั้นแทนที่จะถอดความเขาฉันจะพูดคำตอบของเขา :

ความแตกต่างระหว่างoptionalและ nullableเป็นขอบเขตที่มีการประเมิน คำจำกัดความของ ' optional' พูดถึงคุณสมบัติและค่าฟิลด์และแนะนำว่าควรประเมินคุณสมบัตินี้ภายในรันไทม์ ' nullable' อ้างอิงถึงคอลัมน์ฐานข้อมูลเท่านั้น

หาก Chooses การดำเนินงานในการดำเนินการoptionalแล้วคุณสมบัติเหล่านั้นควรได้รับการประเมินในหน่วยความจำโดยผู้ให้ความคงทนและข้อยกเว้นยกก่อน SQL จะถูกส่งไปยังฐานข้อมูลเป็นอย่างอื่นเมื่อใช้ ' updatable=false' ' optional' ละเมิดจะไม่ได้รับการรายงาน


8
ดังนั้นควรใช้อันไหนจริง ๆ อาจจะทั้งสองอย่าง?
XièJìléi

39
@Xie Jilei: จากหนังสือ: Java persistence with hibernate 2007, p. 179: @Basic(optional = false) @Column(nullable = false)คำอธิบายประกอบ @Basic ทำเครื่องหมายคุณสมบัติว่าไม่ใช่ทางเลือกในระดับวัตถุ Java การตั้งค่าที่สอง nullable = false บนการแมปคอลัมน์มีหน้าที่ในการสร้างข้อ จำกัด ฐานข้อมูล NOT NULL เท่านั้น การใช้งาน Hibernate JPA จะปฏิบัติต่อตัวเลือกทั้งสองในลักษณะเดียวกันไม่ว่าในกรณีใด ๆ ดังนั้นคุณอาจใช้คำอธิบายประกอบเพียงรายการเดียวเพื่อจุดประสงค์นี้
rapt

2
@rapt - ฉันไม่เข้าใจThe @Basic annotation marks the property as not optional on the Java object level.ว่าหมายความว่าอย่างไร? ดังนั้นจึง@Basicเป็นเพียงการบอกว่าสร้างคอลัมน์ฐานข้อมูลNOT NULLสำหรับตัวแปรดังกล่าว?
Erran Morad

9
หมายความว่าหากคุณพยายามที่จะคงอยู่กับเอนทิตีที่มีฟิลด์ว่างจะทำให้เกิดข้อยกเว้นหากถูกทำเครื่องหมายเป็นทางเลือก = เท็จ (โดยไม่ต้องติดต่อฐานข้อมูล) และเอนทิตีจะไม่ถูกเพิ่มลงในบริบทการคงอยู่ของ JPA หากมีเพียงคำอธิบายประกอบเป็น nullable = false เอนทิตีจะถูกเพิ่มลงในบริบทการคงอยู่และเมื่อพยายามเขียนเอนทิตีลงในฐานข้อมูล (ตัวอย่างเช่นผ่านการล้าง) จะพยายามเขียนเอนทิตีลงในฐานข้อมูลซึ่งจะปฏิเสธสิ่งนี้และ มันจะทำให้เกิดข้อยกเว้น
Ray Hulha

@RayHulha ฉันพยายามใส่คำอธิบายประกอบฟิลด์ด้วย "@Basic (ทางเลือก = เท็จ)" และฉันเพิ่มทูเพิลลงในฐานข้อมูล (ด้วยค่าของฟิลด์นี้ = null) ไม่มีข้อยกเว้นเกิดขึ้น !! ฉันหวังว่าคุณจะสามารถอธิบายได้ สำหรับฉันพฤติกรรมนี้
ziMtyth

4

ดังนั้นฉันจึงลองใช้คำอธิบายประกอบ @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 สามารถทำได้)


1
เป็นเรื่องตลกที่คำตอบอื่น ๆ แสดงว่าเป็นโมฆะและไม่ใช่พื้นฐานที่ใช้สำหรับการสร้างสคีมา (เมื่อมีข้อความว่า« 'nullable' อ้างอิงถึงคอลัมน์ฐานข้อมูลเท่านั้น») มันยังสับสนมาก ฉันเดา nullable จะถูกนำมาใช้สำหรับการสร้างสคีมาและขั้นพื้นฐาน (= ตัวเลือกเท็จ) อาจถูกนำมาใช้เพื่อวัตถุประสงค์เดียวกัน? มันสมเหตุสมผลไหม
marcus

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