สมมติว่าคุณมีโครงสร้างข้อมูลบางประเภทซึ่งยังคงอยู่ในฐานข้อมูลบางประเภท เพื่อความง่ายเราจะเรียกโครงสร้างข้อมูลPerson
นี้ ขณะนี้คุณได้รับมอบหมายให้ออกแบบ CRUD API ซึ่งอนุญาตให้แอปพลิเคชันอื่นสร้างอ่านอัปเดตและลบPerson
s เพื่อความง่ายลองสมมติว่า API นี้เข้าถึงได้ผ่านบริการเว็บบางประเภท
สำหรับชิ้นส่วน C, R และ D ของ CRUD การออกแบบนั้นง่าย ฉันจะใช้เครื่องหมายคล้ายฟังก์ชัน C # - การใช้งานอาจเป็น SOAP, REST / JSON หรืออย่างอื่น:
class Person {
string Name;
DateTime? DateOfBirth;
...
}
Identifier CreatePerson(Person);
Person GetPerson(Identifier);
void DeletePerson(Identifier);
แล้วการอัพเดตล่ะ? สิ่งที่ต้องทำตามธรรมชาติคือ
void UpdatePerson(Identifier, Person);
แต่วิธีการที่คุณจะต้องระบุให้ซึ่งด้านของPerson
การอัปเดต?
วิธีแก้ปัญหาที่ฉันสามารถทำได้:
คุณสามารถกำหนดให้บุคคลที่สมบูรณ์ต้องผ่านเช่นลูกค้าจะทำสิ่งนี้เพื่ออัปเดตวันเกิด:
p = GetPerson(id); p.DateOfBirth = ...; UpdatePerson(id, p);
อย่างไรก็ตามนั่นจะต้องมีความสอดคล้องของธุรกรรมหรือการล็อคระหว่างการรับและการปรับปรุง มิฉะนั้นคุณสามารถเขียนทับการเปลี่ยนแปลงอื่น ๆ ที่ทำในแบบคู่ขนานโดยไคลเอนต์อื่น ๆ สิ่งนี้จะทำให้ API มีความซับซ้อนมากขึ้น นอกจากนี้ยังมีข้อผิดพลาดเกิดขึ้นเนื่องจากรหัสหลอกต่อไปนี้ (สมมติว่าภาษาของลูกค้าที่มีการสนับสนุน JSON)
UpdatePerson(id, { "DateOfBirth": "2015-01-01" });
- ซึ่งมีลักษณะที่ถูกต้อง - ไม่เพียง แต่จะเปลี่ยน DateOfBirth แต่ยังรีเซ็ตสาขาอื่น ๆ ทั้งหมดเพื่อ null
null
คุณอาจจะไม่สนใจทุกสาขาที่มี อย่างไรก็ตามคุณจะสร้างความแตกต่างระหว่างการไม่เปลี่ยนDateOfBirth
และจงใจเปลี่ยนเป็นโมฆะได้อย่างไรvoid UpdatePerson(Identifier, Person, ListOfFieldNamesToUpdate)
เปลี่ยนลายเซ็นไปvoid UpdatePerson(Identifier, ListOfFieldValuePairs)
เปลี่ยนลายเซ็นไปใช้คุณสมบัติบางอย่างของโปรโตคอลการส่ง: ตัวอย่างเช่นคุณสามารถละเว้นฟิลด์ทั้งหมดที่ไม่มีอยู่ในการแสดง JSON ของบุคคล อย่างไรก็ตามโดยทั่วไปแล้วจะต้องแยกวิเคราะห์ JSON ด้วยตนเองและไม่สามารถใช้คุณสมบัติที่มีอยู่ในตัวของไลบรารีของคุณ (เช่น WCF)
ไม่มีวิธีแก้ปัญหาใดที่ดูสง่างามสำหรับฉัน แน่นอนว่านี่เป็นปัญหาที่พบบ่อยดังนั้นทุกคนจึงใช้วิธีแก้ปัญหาที่ดีที่สุด
Person
อินสแตนซ์ที่สร้างขึ้นใหม่ซึ่งยังคงไม่ถูกยืนยันและในกรณีที่ตัวระบุถูกตัดสินใจว่าเป็นส่วนหนึ่งของกลไกการคงอยู่ให้ปล่อยให้เป็นโมฆะ สำหรับคำตอบ JPA ใช้หมายเลขเวอร์ชัน ถ้าคุณอ่านเวอร์ชัน 23 เมื่อคุณอัพเดตไอเท็มหากเวอร์ชันใน DB เป็น 24 การเขียนล้มเหลว