โปรดอธิบายเกี่ยวกับ insertable = false และ updatable = false ในการอ้างอิงถึงคำอธิบายประกอบ JPA @Column


151

หากมีการเพิ่มความคิดเห็นของเขตข้อมูลinsertable=false, updatable=falseหมายความว่าคุณไม่สามารถแทรกค่าหรือเปลี่ยนค่าที่มีอยู่ได้ใช่หรือไม่ ทำไมคุณต้องการทำเช่นนั้น?

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}

คำตอบ:


121

คุณจะทำเช่นนั้นเมื่อความรับผิดชอบในการสร้าง / อัปเดตเอนทิตีที่เกี่ยวข้องในคำถามไม่ได้อยู่ในเอนทิตีปัจจุบัน เช่นคุณมีและPerson Addressคุณต้องการที่จะเพิ่มinsertable=false, updatable=falseให้กับ@OneToManyความสัมพันธ์กับPersonนิติบุคคลในAddressนิติบุคคลเพียงเพราะมันไม่ใช่ความรับผิดชอบของกิจการที่จะสร้างหรือการปรับปรุงAddress Personมันเป็นอีกทางหนึ่ง


มันหมายถึงการกำหนดinsertable=false,updatable=falseด้านใดด้านหนึ่งของความสัมพันธ์
BalusC

3
คุณกำลังบอกว่าด้วย updatable = false กับบุคคลมันจะปิดใช้งานการอัปเดตของ Person.name เมื่ออัปเดตที่อยู่ (ฉันไม่เห็นด้วยเพราะนี่คือจุดประสงค์ของการเรียงซ้อน) นอกจากนี้คุณกำลังบอกว่าคำจำกัดความของคอลัมน์ทำสิ่งที่แตกต่างเมื่อกุญแจต่างประเทศของตน (คน) และเมื่อมันไม่ได้เป็นกุญแจต่างประเทศ (เนื่องจากไม่มีนิติบุคคลอ้างอิงเพื่อปิดการใช้งานการปรับปรุง) โดยการอ่าน javadoc สำหรับการอัพเดทฉันจะบอกว่ามันจะปิดการใช้งานเพื่อเปลี่ยนบุคคลสำหรับที่อยู่ที่กำหนดถ้ามันยังคงอยู่ คุณช่วยอธิบายได้มั้ย
Flowy

8
ฉันคิดว่าคุณตั้งใจจะพูด... to the @ManyToOne relationship with the ...??
Martin Konecny

111

การกำหนดinsertable=false, updatable=falseมีประโยชน์เมื่อคุณต้องการแมปเขตข้อมูลมากกว่าหนึ่งครั้งในเอนทิตีโดยทั่วไป:

นี่คือ IMO ไม่ใช่ความหมาย แต่เป็นเทคนิคอย่างหนึ่ง


15
ฉันเชื่อมั่นอย่างยิ่งว่าคำตอบนี้ดีกว่าคำตอบที่ได้รับ คำตอบที่ได้รับการยอมรับนั้นบ่งบอกถึงความรู้สึกว่าคุณลักษณะที่แทรก / อัปเดตได้เกี่ยวข้องกับการสร้าง / อัพเดทของเอนทิตีที่เกี่ยวข้องในขณะที่เจตนาที่แท้จริงที่อยู่เบื้องหลังคุณลักษณะเหล่านี้คือการป้องกันการแทรก / อัพเดทของคอลัมน์ในเอนทิตี้ปัจจุบัน การสร้าง / อัพเดตของเอนทิตีที่เกี่ยวข้องถูกจัดการโดยแอ็ตทริบิวต์ cascade ของคำอธิบายประกอบการแม็พ
Jayant

25

ฉันต้องการเพิ่มคำตอบของBalusCและPascal Thivent การใช้งานทั่วไปอีกอย่างของinsertable=false, updatable=false:

พิจารณาคอลัมน์ที่ไม่ต์IDแต่ชนิดของบางหมายเลขลำดับ ความรับผิดชอบในการคำนวณหมายเลขลำดับอาจไม่จำเป็นต้องเป็นของแอปพลิเคชัน

ตัวอย่างเช่นหมายเลขลำดับเริ่มต้นด้วย 1,000 และควรเพิ่มทีละหนึ่งสำหรับแต่ละเอนทิตีใหม่ สิ่งนี้ทำได้ง่ายและเหมาะสมมากดังนั้นในฐานข้อมูลและในกรณีเช่นนี้การกำหนดค่าเหล่านี้สมเหตุสมผล


1
JPA ได้รับการสนับสนุนเช่นกันดังนั้นคุณสามารถกำหนดลำดับของคุณด้วยคำอธิบายประกอบ JPA ได้เช่นกัน
eis

8

ตัวอย่างอื่นจะอยู่ในคอลัมน์ "created_on" ซึ่งคุณต้องการให้ฐานข้อมูลจัดการกับการสร้างวันที่


ไฮเบอร์เนตควรจะบล็อกการอัปเดตตามหมายเหตุประกอบ updatable = false หรือไม่? ในที่เก็บ JPA ของฉันทดสอบคอลัมน์ created_on พร้อมคำอธิบายประกอบนี้ยอมรับการอัพเดตโดยไม่มีการร้องเรียน
chrisinmtown

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