การพูดว่าเป็นคนที่ใช้เวลาทำงานกับ JPA (Java Persistence API โดยทั่วไปจะเป็นมาตรฐาน ORM API สำหรับ Java / J2EE / EJB) ซึ่งรวมถึง Hibernate, EclipseLink, Toplink, OpenJPA และอื่น ๆ ฉันจะแบ่งปันบางส่วนของฉัน ข้อสังเกต
- ORMs ไม่เร็ว พวกเขาสามารถเพียงพอและส่วนใหญ่เวลาที่เพียงพอก็โอเค แต่ในสภาพแวดล้อมที่มีความล่าช้าต่ำปริมาณสูงพวกเขาจะไม่มี
- โดยทั่วไปแล้วการเขียนโปรแกรมภาษาเช่น Java และ C # คุณต้องใช้เวทย์มนตร์มากมายที่จะทำให้มันทำงานได้ (เช่นการทอโหลดใน Java, การใช้เครื่องมือ, ฯลฯ );
- เมื่อใช้ ORM แทนที่จะได้รับเพิ่มเติมจาก SQL (ซึ่งดูเหมือนจะเป็นเจตนา) คุณจะประหลาดใจว่าคุณใช้เวลาปรับแต่ง XML และ / หรือคำอธิบายประกอบ / แอตทริบิวต์เพื่อให้ ORM ของคุณสร้าง SQL ที่มีประสิทธิภาพ
- สำหรับข้อความค้นหาที่ซับซ้อนจะไม่มีสิ่งทดแทน เช่นเดียวกับใน JPA มีแบบสอบถามบางอย่างที่เป็นไปไม่ได้ที่อยู่ใน SQL ดิบและเมื่อคุณต้องใช้ SQL ดิบใน JPA มันไม่สวย (C # /. สุทธิอย่างน้อยมีประเภทไดนามิก - var - ซึ่งเป็นจำนวนมาก ดีกว่าอาเรย์ Object);
- มี "gotchas" อันน่ากลัวมากมายเมื่อใช้ ORM ซึ่งรวมถึงพฤติกรรมที่ไม่ได้ตั้งใจหรือไม่คาดคิดความจริงที่ว่าคุณต้องสร้างความสามารถในการอัปเดต SQL ไปยังฐานข้อมูลของคุณ (โดยใช้การรีเฟรช () ใน JPA หรือวิธีที่คล้ายกันเพราะ JPA โดยค่าเริ่มต้นแคชทุกอย่าง update - การรันการอัพเดต SQL โดยตรงเป็นกิจกรรมสนับสนุนการผลิตทั่วไป);
- ความไม่ตรงกันของวัตถุสัมพันธ์จะทำให้เกิดปัญหาเสมอ กับปัญหาดังกล่าวมีการแลกเปลี่ยนระหว่างความซับซ้อนและความสมบูรณ์ของสิ่งที่เป็นนามธรรม ในบางครั้งฉันรู้สึกว่า JPA ไปไกลเกินไปและตีกฎที่แท้จริงของผลตอบแทนที่ลดน้อยลงซึ่งความซับซ้อนของการตีไม่ได้เป็นสิ่งที่ชอบธรรมจากสิ่งที่เป็นนามธรรม
มีปัญหาอีกข้อหนึ่งซึ่งใช้เวลาอธิบายเพิ่มเติมเล็กน้อย
โมเดลดั้งเดิมสำหรับเว็บแอ็พพลิเคชันคือการมีชั้นการคงอยู่และเลเยอร์การนำเสนอ (อาจเป็นกับบริการหรือเลเยอร์อื่น ๆ ในระหว่าง แต่สิ่งเหล่านี้เป็นสองสิ่งที่สำคัญสำหรับการสนทนานี้) ORMs บังคับมุมมองที่เข้มงวดจากเลเยอร์การคงอยู่ของคุณจนถึงเลเยอร์การนำเสนอ (เช่นเอนทิตีของคุณ)
หนึ่งในการวิพากษ์วิจารณ์วิธีการ SQL แบบดิบเพิ่มเติมคือคุณต้องจบลงด้วย VOs (ค่าวัตถุ) หรือ DTOs (วัตถุการถ่ายโอนข้อมูล) ที่ใช้โดยการสืบค้นเพียงครั้งเดียว สิ่งนี้ได้รับการขนานนามว่าเป็นประโยชน์ของ ORMs เพราะคุณกำจัดมัน
สิ่งที่เป็นปัญหาเหล่านั้นไม่ได้หายไปกับ ORM เพียง แต่เลื่อนไปยังเลเยอร์การนำเสนอ แทนที่จะสร้าง VOs / DTO สำหรับคิวรีคุณสร้างออบเจกต์การนำเสนอที่กำหนดเองซึ่งมักจะเป็นหนึ่งสำหรับทุกมุมมอง มันจะดีกว่านี้อย่างไร IMHO มันไม่ใช่
ฉันได้เขียนเกี่ยวกับเรื่องนี้ในORM หรือ SQL: เรายังอยู่หรือเปล่า? .
เทคโนโลยีการคงอยู่ของฉันที่เลือก (ใน Java) วันนี้คือ ibatis มันเป็น wrapper สวย ๆ เกี่ยวกับ SQL ซึ่งทำ 90% + ของสิ่งที่ JPA สามารถทำได้ (สามารถทำได้แม้กระทั่งการโหลดความสัมพันธ์แบบขี้เกียจแม้ว่ามันจะไม่ได้รับการบันทึกไว้อย่างดีก็ตาม) แต่มีค่าใช้จ่ายน้อยกว่ามาก
ปีนี้เกิดขึ้นในแอปพลิเคชัน GWT ที่ฉันเขียน การแปลจำนวนมากจาก EclipseLink ไปยังวัตถุการนำเสนอในการใช้งานบริการ ถ้าเราใช้ ibatis มันคงจะง่ายกว่าที่จะสร้างวัตถุที่เหมาะสมด้วย ibatis แล้วส่งพวกมันไปเรื่อย ๆ จนถึงกองซ้อน นักพิถีพิถันบางคนอาจโต้แย้งว่านี่คือ Bad ™ อาจเป็นไปได้ (ในทางทฤษฎี) แต่ฉันบอกคุณว่า: มันจะนำไปสู่โค้ดที่ง่ายกว่า, สแต็กที่ง่ายกว่า