ไฮเบอร์เนตกับ JPA เทียบกับ JDO ข้อดีและข้อเสียของแต่ละ? [ปิด]


174

ฉันคุ้นเคยกับ ORM เป็นแนวคิดและฉันใช้ nHibernate หลายปีที่ผ่านมาสำหรับโครงการ. NET อย่างไรก็ตามฉันไม่ได้ติดตามหัวข้อ ORM ใน Java และไม่ได้มีโอกาสใช้เครื่องมือเหล่านี้

แต่ตอนนี้ฉันอาจมีโอกาสเริ่มใช้เครื่องมือ ORM บางอย่างสำหรับหนึ่งในแอปพลิเคชันของเราในความพยายามที่จะย้ายออกจากชุดบริการเว็บดั้งเดิม

ฉันมีเวลายากที่จะบอกความแตกต่างระหว่างข้อกำหนด JPA สิ่งที่คุณจะได้รับจากห้องสมุด Hibernate และสิ่งที่ JDO มีให้

ดังนั้นฉันเข้าใจว่าคำถามนี้เป็นบิตปลายเปิด แต่ฉันหวังว่าจะได้รับความคิดเห็นบางอย่างเกี่ยวกับ:

  • ข้อดีและข้อเสียของแต่ละข้อคืออะไร?
  • คุณต้องการแนะนำโครงการใหม่แบบใด
  • มีเงื่อนไขบางประการหรือไม่ที่จะใช้กรอบหนึ่งกับอีกกรอบหนึ่ง

คำตอบ:


112

หมายเหตุบางส่วน:

  • JDO และ JPA เป็นทั้งข้อมูลจำเพาะไม่ใช่การนำไปใช้งาน
  • แนวคิดคือคุณสามารถสลับการใช้งาน JPA ได้หากคุณ จำกัด รหัสของคุณให้ใช้ JPA มาตรฐานเท่านั้น (เช่นเดียวกันสำหรับ JDO)
  • ไฮเบอร์เนตสามารถใช้เป็นการดำเนินการอย่างหนึ่งของ JPA
  • อย่างไรก็ตาม Hibernate มี API ดั้งเดิมพร้อมด้วยคุณสมบัติที่เหนือกว่า JPA

IMO ฉันจะแนะนำ Hibernate


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

  • หากคุณไม่กังวลเกี่ยวกับความคาดหวังของผู้ขายให้เลือกตัวเลือกระหว่าง Hibernate และการใช้งาน JPA และ JDO อื่น ๆรวมถึงส่วนขยายเฉพาะของผู้ขายต่าง ๆ ในการตัดสินใจของคุณ

  • หากคุณกังวลเกี่ยวกับความคาดหวังของการผูกมัดผู้จำหน่ายและคุณไม่สามารถใช้ JPA ได้โดยไม่ต้องหันไปใช้ส่วนขยายเฉพาะของผู้จำหน่ายดังนั้นอย่าใช้ JPA (เช่นเดียวกันสำหรับ JDO)

ในความเป็นจริงคุณอาจจะต้องมีการค้าออกเท่าไหร่ที่คุณมีความกังวลใจโดยผู้ผลิตผูกอยู่กับวิธีการมากที่คุณต้องนามสกุลเฉพาะผู้ขายเหล่านั้น

และยังมีปัจจัยอื่น ๆ เช่นคุณ / พนักงานของคุณรู้จักเทคโนโลยีที่เกี่ยวข้องดีแค่ไหนค่าใช้จ่ายในการออกใบอนุญาตจำนวนเท่าไรและเรื่องราวที่คุณเชื่อว่าจะเกิดขึ้นในอนาคตสำหรับ JDO และ JPA


8
ชุดเครื่องมือที่ดีและสั้น อีกประเด็นที่ควรกล่าวถึงคือ JPA ไม่ได้ป้องกันไม่ให้ใช้คุณลักษณะเฉพาะของการใช้งานหากจำเป็น ซึ่งหมายความว่า JPA ให้คุณใช้คุณสมบัติไฮเบอร์เนตเมื่อใช้ไฮเบอร์เนต
topchef

1
อะไรคือข้อดีของการใช้ JPA ถ้าฉันต้องการคุณสมบัติเฉพาะบางอย่างจากไฮเบอร์เนต?
Bruno Reis

22
หมายเหตุสำคัญที่ควรเพิ่ม: ในขณะที่ JPA และ JDO ทั้งสองมีการสนับสนุน RDBMS ที่ยอดเยี่ยม JDO เป็นผู้ไม่เชื่อเรื่องพระเจ้า 'datastore' และดังนั้นจึงไม่ จำกัด อยู่ที่โลก RDBMS ด้วยพื้นดินที่ขยายตัวของ NoSQL ในขณะนี้บุคคลควรพิจารณาใช้มาตรฐานการคงอยู่ที่หลีกเลี่ยงการล็อกแอปของพวกเขาไปสู่โลก SQL แบบดั้งเดิม แอ็พพลิเคชัน JDO สามารถปรับใช้ไม่ใช่ที่เก็บข้อมูล RDBMS รายการทั้งหมดของดาต้าสโตร์ที่
Volksman

2
@ Golfman ทำไมเลือกตามสิ่งที่อาจเกิดขึ้น? ไม่มีอะไรที่จะหยุดคุณไม่ให้ทำอะไรอย่างอื่นในภายหลังหากคุณเคยต้องการการสนับสนุน NoSQL ... KISS
TM

1
@Bruno - เมื่อคุณใช้ชิ้นส่วนเฉพาะของ Hibernate ที่ไม่ได้จำศีลคุณกำลังใช้ JPA เห็นได้ชัดว่าข้อดีของการ จำกัด ตัวเองเป็น JPA บริสุทธิ์คือคุณสามารถเปลี่ยนไปใช้การดำเนินการ JPA อื่นได้ง่ายขึ้น
สตีเฟ่นซี

69

ตรวจสอบให้แน่ใจว่าคุณประเมินการใช้งาน DataNucleus ของ JDO เราเริ่มต้นด้วย Hibernate เพราะดูเหมือนจะได้รับความนิยม แต่ในไม่ช้าก็รู้ว่ามันไม่ใช่วิธีการคงอยู่ที่โปร่งใส 100% มีจำนวนคำเตือนมากเกินไปและเอกสารประกอบเต็มไปด้วย 'หากคุณมีสถานการณ์นี้คุณต้องเขียนโค้ดของคุณแบบนี้' ซึ่งทำให้ความสนุกในการสร้างแบบจำลองและการเข้ารหัสได้อย่างอิสระตามที่เราต้องการ JDO ไม่เคยทำให้ฉันต้องปรับรหัสหรือโมเดลของฉันเพื่อให้มัน 'ทำงานอย่างถูกต้อง' ฉันสามารถออกแบบและเขียนรหัส POJO แบบง่าย ๆ ได้ราวกับว่าฉันจะใช้พวกเขา 'ในหน่วยความจำ' เท่านั้น แต่ฉันสามารถยืนยันได้อย่างโปร่งใส

ข้อได้เปรียบอื่น ๆ ของ JDO / DataNucleus มากกว่าการจำศีลคือมันไม่ได้มีค่าใช้จ่ายในการสะท้อนเวลาทำงานทั้งหมดและมีหน่วยความจำที่มีประสิทธิภาพมากขึ้นเพราะใช้การปรับปรุงโค้ดไบต์เวลาสร้าง (อาจเพิ่ม 1 วินาทีในการสร้างโครงการขนาดใหญ่) มากกว่ารูปแบบพร็อกซีที่ได้รับการสนับสนุนที่สะท้อนเวลาของไฮเบอร์เนต

สิ่งที่คุณอาจพบว่าน่ารำคาญกับ Hibernate ก็คือการอ้างอิงที่คุณมีต่อสิ่งที่คุณคิดว่าเป็นวัตถุ ... มันมักจะเป็น 'พร็อกซี' สำหรับวัตถุ หากไม่ได้รับประโยชน์จากการเพิ่มรหัสไบต์รูปแบบพร็อกซีจำเป็นต้องอนุญาตให้โหลดตามความต้องการ (เช่นหลีกเลี่ยงการดึงกราฟวัตถุทั้งหมดของคุณเมื่อคุณดึงวัตถุระดับบนสุด) ได้เตรียมที่จะแทนที่เท่ากับและ hashcode เพราะวัตถุที่คุณคิดว่าคุณอ้างอิงมักจะเป็นเพียงตัวแทนสำหรับวัตถุนั้น

นี่คือตัวอย่างของความผิดหวังที่คุณจะได้รับด้วย Hibernate ที่คุณจะไม่ได้รับจาก JDO:

http://blog.andrewbeacock.com/2008/08/how-to-implement-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53

หากคุณต้องการให้รหัส 'การแก้ไขปัญหา' แน่นอนว่าไฮเบอร์เนตเหมาะสำหรับคุณ ถ้าคุณชื่นชมสะอาดบริสุทธิ์วัตถุที่มุ่งเน้นการพัฒนารูปแบบการขับเคลื่อนที่คุณใช้จ่ายตลอดเวลาของคุณในการสร้างแบบจำลองการออกแบบและการเข้ารหัสและไม่มีมันในการแก้ไขปัญหาที่น่าเกลียดแล้วใช้จ่ายไม่กี่ชั่วโมงประเมินJDO / DataNucleus ชั่วโมงการลงทุนจะได้รับการชำระคืนเป็นพันเท่า

อัพเดท ก.พ. 2560

ในขณะนี้ DataNucleus ใช้มาตรฐาน JPA persistence นอกเหนือจาก JDO persistence standard ดังนั้นการย้ายโครงการ JPA ที่มีอยู่จาก Hibernate ไปยัง DataNucleus ควรตรงไปตรงมาและคุณจะได้รับประโยชน์ทั้งหมดที่กล่าวถึงข้างต้นจาก DataNucleus , ถ้ามี. ดังนั้นในแง่ของคำถามการเลือกมาตรฐานเฉพาะ JPA (RDBMS เท่านั้น) เทียบกับ JDO (RDBMS + ไม่มี SQL + ODBMSes + อื่น ๆ ) DataNucleus สนับสนุนทั้งสองไฮเบอร์เนตจึงถูก จำกัด ให้ JPA เท่านั้น

ประสิทธิภาพของการอัพเดต DB ของไฮเบอร์เนต

อีกประเด็นที่ควรพิจารณาเมื่อเลือก ORM คือประสิทธิภาพของกลไกการตรวจสอบที่สกปรกซึ่งมีความสำคัญอย่างยิ่งเมื่อต้องสร้าง SQL เพื่ออัปเดตวัตถุที่มีการเปลี่ยนแปลงในธุรกรรมปัจจุบัน - โดยเฉพาะอย่างยิ่งเมื่อมีวัตถุจำนวนมาก มีคำอธิบายทางเทคนิคโดยละเอียดเกี่ยวกับกลไกการตรวจสอบที่สกปรกของ Hibernate ในคำตอบ SO นี้: JPA พร้อม HIBERNATE แทรกช้ามาก


3
และอย่างที่เราทราบกันดีว่าการเพิ่มประสิทธิภาพเป็นสิ่งที่แม่นยำว่าทำไม JDO จึงถูกนำมาใช้อย่างหนาแน่น!
Pascal Thivent

15
FUD ที่ได้รับการเผยแพร่อย่างดีและ astroturfing ดำเนินการโดยผู้เล่นไฮเบอร์เนตสำคัญ ๆ ในช่วงแรก ๆ ที่เกี่ยวข้องกับ JDO ไม่มีอะไรที่ไม่ซื่อสัตย์และน่าขยะแขยงและไม่ต้องสงสัยเลยว่ามีผลกระทบต่อการยอมรับของ JDO วันนี้นักพัฒนารู้ว่าการปรับปรุงรหัสไบต์ไม่ใช่ปัญหาเลยและมักจะใช้เพื่อจุดประสงค์อื่นนอกเหนือจากการคงอยู่ ไลบรารีการปรับปรุงโค้ดไบต์ ASM ใหม่นั้นเร็วมากจนคุณไม่มีเวลาสูดลมหายใจก่อนที่จะเสร็จสิ้น
Volksman

7
ทำนายความล้มเหลวของ JDO ตั้งแต่เริ่มต้น ( javalobby.org/forums/thread.jspa?forumID=46&threadID=1326 ) และก่อนไฮเบอร์เนตดังนั้นคุณจึงไม่สามารถตำหนิไฮเบอร์เนตได้ Hibernate / Toplink ประสบความสำเร็จที่ผู้เล่น Sun และ JDO (และ OODBMS) ล้มเหลวเพราะพวกเขาตอบคำถามได้ดีกว่าในเวลานั้นไม่ใช่เพราะการตลาดและ FUD ระยะเวลา ใครจะสนใจว่า ASM กำลังจ้องมองอย่างรวดเร็วในวันนี้มันไม่ได้อยู่ที่นั่นเมื่อ 5+ ปีก่อนเมื่อจำเป็นและ JDO แพ้การต่อสู้ JDO ยอดเยี่ยมในด้านแนวคิดหรือไม่? น่าเสียดายที่มันล้มเหลวในการดำเนินการตามกำหนดเวลาผู้ชนะ (และจะไม่กลับมาเนื่องจาก JPA)
Pascal Thivent

2
เพื่อแสดงให้เห็นคำพูดของฉัน (ยังโพสต์ที่แสดงให้เห็นถึงความเจ็บปวดที่คนมีความรู้สึกในระหว่างการพัฒนาหรืออื่นทำไม Hibernate ได้ชนะการต่อสู้): mail-archive.com/open-jpa-dev@incubator.apache.org/... สำหรับฉันแล้วการไตร่ตรอง / cglib เป็นคำตอบที่ปฏิบัติได้จริงสำหรับปัญหาของผู้คน (และคนไม่สนใจว่า API นั้นเหนือกว่าแนวคิดหรือไม่หากใช้งานลำบาก) และฉันไม่เห็นผู้เล่นคนสำคัญไฮเบอร์เนตที่นี่เพียงแค่ผู้ใช้ . ดังนั้นในตอนท้ายฉันสงสัยว่าใครกำลังแพร่กระจาย FUD จริง ๆ ...
Pascal Thivent

7
อย่างนี้ไม่เหมือนสมัยก่อนที่จะมีโพสต์อย่างน้อย 17 โปรไฮเบอร์เนต FUD (แต่มาจาก 3 ที่อยู่ IP ที่แตกต่างกันทำคนคณิตศาสตร์ =)
Volksman

54

ฉันเพิ่งได้รับการประเมินและเลือกกรอบการติดตาสำหรับโครงการ java และการค้นพบของฉันมีดังนี้:

สิ่งที่ฉันเห็นคือการสนับสนุนJDOนั้นสำคัญที่สุด:

  • คุณสามารถใช้แหล่งข้อมูลที่ไม่ใช่ sql, db4o, hbase, ldap, bigtable, couchdb (ปลั๊กอินสำหรับคาสซานดรา) เป็นต้น
  • คุณสามารถเปลี่ยนจากแหล่งข้อมูล sql เป็น non-sql datasource และในทางกลับกันได้
  • ไม่มีวัตถุพร็อกซีและดังนั้นจึงมีความเจ็บปวดน้อยลงเกี่ยวกับการใช้ hashcode () และเท่ากับ ()
  • POJO ที่มากขึ้นและการแก้ไขปัญหาจึงน้อย
  • รองรับความสัมพันธ์และประเภทฟิลด์เพิ่มเติม

และการสนับสนุนแก่JPAนั้นเป็นหลัก:

  • เป็นที่นิยมมากขึ้น
  • jdo ตายแล้ว
  • ไม่ได้ใช้การปรับปรุง bytecode

ฉันเห็นโพสต์ Pro-JPA จำนวนมากจากผู้พัฒนา JPA ที่ไม่ได้ใช้ JDO / Datanucleus อย่างชัดเจนซึ่งเสนอข้อโต้แย้งที่อ่อนแอสำหรับการไม่ใช้ JDO

ฉันยังเห็นโพสต์จำนวนมากจากผู้ใช้ JDO ที่ย้ายมาที่ JDO และมีความสุขมากขึ้น

ในแง่ของ JPA ได้รับความนิยมมากขึ้นดูเหมือนว่านี่เป็นส่วนหนึ่งเนื่องจากการสนับสนุนผู้ขาย RDBMS มากกว่าที่จะเป็นเทคนิคที่เหนือกว่า (ฟังดูเหมือน VHS / Betamax กับฉัน)

การใช้งาน JDO และมันคือการอ้างอิง Datanucleus ยังไม่ตายอย่างที่แสดงโดยการยอมรับของ Google สำหรับ GAE และการพัฒนาอย่างแข็งขันในซอร์สโค้ด (http://sourceforge.net/projects/datanucleus/)

ฉันได้เห็นการร้องเรียนจำนวนมากเกี่ยวกับ JDO เนื่องจากการปรับปรุง bytecode แต่ยังไม่มีคำอธิบายว่าทำไมมันถึงไม่ดี

ในความเป็นจริงในโลกที่กำลังหมกมุ่นอยู่กับโซลูชั่น NoSQL มากขึ้น JDO (และการใช้งานฐานข้อมูล) ดูเหมือนจะปลอดภัยกว่ามาก

ฉันเพิ่งเริ่มใช้ JDO / Datanucleus และตั้งค่าเพื่อให้ฉันสามารถสลับระหว่างการใช้ db4o และ mysql ได้อย่างง่ายดาย มันมีประโยชน์สำหรับการพัฒนาอย่างรวดเร็วในการใช้ db4o และไม่ต้องกังวลมากเกินไปเกี่ยวกับ schema ของ DB จากนั้นเมื่อ schema นั้นมีความเสถียรในการปรับใช้กับฐานข้อมูล ฉันยังรู้สึกมั่นใจว่าในภายหลังฉันสามารถปรับใช้ทั้งหมด / บางส่วนของแอปพลิเคชันของฉันไปยัง GAE หรือใช้ประโยชน์จากที่เก็บข้อมูลแบบกระจาย / แผนที่ - ลด la hbase / hadoop / Cassandra โดยไม่ต้องทำการปรับสภาพมากเกินไป

ฉันพบอุปสรรค์เริ่มต้นของการเริ่มต้นใช้งาน Datanucleus นิดหน่อย - เอกสารบนเว็บไซต์ดาต้านิวเคลียสนั้นยากที่จะเข้าใจ - บทเรียนไม่ง่ายที่จะติดตามอย่างที่ฉันชอบ ต้องบอกว่าเอกสารรายละเอียดเพิ่มเติมเกี่ยวกับ API และการแมปนั้นดีมากเมื่อคุณผ่านช่วงการเรียนรู้เริ่มต้น

คำตอบคือมันขึ้นอยู่กับสิ่งที่คุณต้องการ ฉันอยากจะมีรหัสที่สะอาดกว่าไม่มีผู้ขายล็อคอินตัวเลือกเพิ่มเติม pojo-orientated, nosql ข้อที่นิยมมากขึ้น

หากคุณต้องการความรู้สึกจุกจิกอบอุ่นที่คุณกำลังทำเช่นเดียวกันกับนักพัฒนา / แกะส่วนใหญ่ให้เลือก JPA / hibernate หากคุณต้องการเป็นผู้นำในสาขาของคุณลองขับ JDO / Datanucleus และสร้างความคิดของคุณเอง


9
ที่จริงแล้วอย่างที่ฉันพูดฉันแค่ให้ความประทับใจกับสิ่งที่ฉันค้นพบในขณะที่พยายามเลือกวิธีแก้ปัญหา ใช่ฉันเป็นผู้เริ่มต้นใน Java ทำไมจึงเป็นเช่นนั้น relavent ในทางกลับกันคุณได้โพสต์หลายครั้งโดยระบุความคิดเห็นของคุณว่า JDO ตายไปแล้วโดยไม่มีการเสนอข้อเท็จจริงหรือข้อพิสูจน์ใด ๆ เพื่อยืนยันและไม่ยอมรับขอบเขตทางเทคนิคที่ JDO เหนือกว่าอย่างชัดเจน เห็นได้ชัดว่าคุณมีบางอย่างที่เป็นส่วนตัวกับ JDO / Datanucleus และใช้เธรดเหล่านี้เป็นวิธีในการยืดอายุท่าทางต่อต้าน JDO ของคุณ
Tom

4
ปาสคาล - คุณโต้เถียงตัวเองเข้ามุมที่นี่ ฉันคิดว่าคุณพลาดประเด็นในส่วนการโฆษณาของคำถามที่พบบ่อย OP ขอความคิดเห็นเกี่ยวกับ 2 เทคโนโลยี เป็นการเชิญผู้ที่สนับสนุนทั้งสองฝ่ายให้มาข้างหน้าและเสนอคำวิจารณ์ / คำแนะนำที่สร้างสรรค์ สำหรับ Andy / Datanucleus และผู้ใช้ JDO อื่น ๆ เพื่อเน้น JDO ที่เป็นบวกและป้องกันการวิพากษ์วิจารณ์นั้นไม่มีการโฆษณามากกว่าคนที่นี่ที่แนะนำให้ใช้การไฮเบอร์เนต
Tom

5
คุณอาจอ้างถึงส่วนของคำถามที่พบบ่อยซึ่งระบุว่า 'เป็นคนดี' สำหรับการโพสต์ของคุณในหัวข้อนี้เป็นเรื่องที่ผิดกติกาการเผชิญหน้าหรือหยาบคาย ครั้งแรกของคุณเป็นความคิดเห็นที่เหน็บแนมเกี่ยวกับการปรับปรุง ที่สอง; คุยโวเกี่ยวกับความยากลำบากของการใช้งานในช่วงต้นและจะไม่เกี่ยวข้องอีกต่อไป ประการที่สามคือการเยาะเย้ยเด็กและดูถูกคนที่อาจไม่ต้องการใช้ RDBMS ข้อที่สี่เป็นการเยาะเย้ยถากถางคนที่มีมุมมองที่แตกต่างกับคุณ ประการที่ห้าคือการโจมตี เรียกฉันว่านกแก้ว คุณคิดว่า 'เป็นคนดี' หรือไม่?
Tom

3
หากคุณมีประสบการณ์ที่น่ากลัวกับ JDO ให้อธิบายสิ่งที่น่ากลัวรับทราบว่าเป็นรุ่นก่อนหน้าและสิ่งต่าง ๆ อาจได้รับการปรับปรุงตั้งแต่นั้นมา คุณต้องตระหนักว่าคนอื่นอาจมีความต้องการที่แตกต่างกันสำหรับคุณ เพียงเพราะคุณพอใจกับ JPA และต้องการใช้ RDBMS ไม่ได้หมายความว่าคนอื่นเป็นเช่นนั้น บางทีในความเร่งรีบของคุณเพื่อเพิ่มชื่อเสียงของคุณคุณได้สูญเสียสายตาของชื่อเสียงที่มีให้รางวัล? PS ในฐานะนักพัฒนาคุณควรสนใจในความเป็นอยู่ที่ดีของโครงการดังกล่าวเพราะนั่นคือสิ่งที่ขับเคลื่อนนวัตกรรมและลดการล็อคผู้ขาย
Tom

6
นี่จะเป็นคำตอบสุดท้ายของฉัน :) .. 1. ถ้ามันไม่ตอบคำถามทำไมยกมันขึ้นมา? 2. ฉันไม่เคยถามความซื่อสัตย์ของคุณฉันบอกว่าคุณไม่ได้ดีกับผู้โพสต์คนอื่นและคุณขัดแย้งกับตัวเอง 3. ไม่มีใครแนะนำให้คุณสรุป 8 ปีขึ้นไป แต่สำรองข้อมูลของคุณด้วยข้อเท็จจริงและตัวอย่างมากกว่าแถลงการณ์ส่วนตัวที่น่าจะทำให้ขุ่นเคือง 5. ทัศนคติ 'hibernate / jpa / jboss is evil' อยู่ที่ไหนในบทความนี้ ฉันไม่เห็นมัน ฉันเห็นเพียงความคิดเห็นต่อต้าน JDO ของคุณ
ทอม

40

คุณต้องการแนะนำโครงการใหม่แบบใด

ฉันจะไม่แนะนำ! ใช้ฤดูใบไม้ผลิเป็น DAO JdbcTemplateร่วมกับStoredProcedure, RowMapperและRowCallbackHandlerแทน

ประสบการณ์ส่วนตัวของฉันกับไฮเบอร์เนตคือเวลาที่บันทึกไว้ล่วงหน้านั้นตรงข้ามกับวันที่ไม่รู้จบที่คุณจะต้องพยายามทำความเข้าใจและแก้ไขปัญหาเช่นพฤติกรรมการอัพเดตที่ไม่คาดคิด

หากคุณใช้ฐานข้อมูลเชิงสัมพันธ์ยิ่งรหัสของคุณใกล้เคียงกับคุณมากเท่าไหร่ก็ยิ่งมีการควบคุมมากขึ้นเท่านั้น ชั้น DAO ของสปริงอนุญาตให้ควบคุมเลเยอร์การแมปได้อย่างดีในขณะเดียวกันก็ไม่จำเป็นต้องใช้รหัสสำเร็จรูปอีกต่อไป นอกจากนี้ยังรวมเข้ากับเลเยอร์ธุรกรรมของสปริงซึ่งหมายความว่าคุณสามารถเพิ่ม (โดย AOP) พฤติกรรมการทำธุรกรรมที่ซับซ้อนได้อย่างง่ายดายโดยไม่ต้องบุกรุกเข้าไปในโค้ดของคุณ (แน่นอนคุณได้รับสิ่งนี้ด้วยไฮเบอร์เนต)


4
นี่เป็นตัวเลือกการแมปการต่อต้านความสัมพันธ์เชิงวัตถุ (ORM) ที่ชัดเจนซึ่งขับเคลื่อนโดยผู้ใช้ขนาดใหญ่และฐานรหัสที่สะสมมาตั้งแต่ครั้ง ODBC (ช่วงต้น 90s) (อ่านดั้งเดิม) ไม่มีเหตุผลที่จะไม่ใช้ JDBC (ไม่ว่าจะมีหรือไม่มีสปริง) เว้นแต่คุณจะเลือกที่จะไปและใช้เฟรมเวิร์ก ORM คิดว่าคนเหล่านั้นที่วันหนึ่งตัดสินใจทิ้ง FORTRAN ให้ใช้ C หรือ Pascal
topchef

23
@grigory - ฉันพูดด้วยประสบการณ์มากมายในการพยายามทำความเข้าใจกับปัญหาไฮเบอร์เนตเช่นการปรับปรุง / ลบเรียงซ้อนโครงสร้างการสืบค้นที่ไร้ประสิทธิภาพอย่างน่าขันเป็นต้นโซลูชัน ORM เป็น "Quick-win" สำหรับผู้ที่มีความเข้าใจฐานข้อมูลเชิงสัมพันธ์ไม่เพียงพอ ดังนั้นจึงไม่น่าที่ความรู้เรื่อง Hibernate เพียงอย่างเดียวจะส่งผลให้เกิดผลิตภัณฑ์ขั้นสุดท้ายที่ดี มันเป็นประสบการณ์ของฉันว่าตลอดระยะเวลาโครงการไฮเบอร์เนต (และ ORM ตามส่วนขยาย) ใช้เวลามากกว่าที่ประหยัด
oxbow_lakes

8
ขออภัยที่คุณมีประสบการณ์ที่ไม่ดีกับไฮเบอร์เนต ฉันมาจากฐานข้อมูลหนัก / SQL / ขั้นตอนการจัดเก็บ / โรงเรียน JDBC ด้วยตัวเอง ฉันไม่สามารถพูดได้ว่าฉันเป็นคนแปลง - ทุกเทคโนโลยีข้างต้นยังคงมีสถานที่ แต่สำหรับวัตถุประสงค์ทั่วไปแอปพลิเคชัน Java 3-tier (ไม่ว่าขนาดใด) ตัวเลือกแรกคือเทคโนโลยี ORM - โดยเฉพาะอย่างยิ่ง JPA 2 อื่น ๆ จะได้รับการพิจารณาตามปัจจัยดังกล่าว ได้แก่ รหัสดั้งเดิมการผสานรวมความเชี่ยวชาญความต้องการแบทช์แบบเรียลไทม์ ประสิทธิภาพเป็นต้นซึ่งอาจบังคับ (หรืออาจไม่) ใกล้กับเทคโนโลยีฐานข้อมูลที่แตกต่างกัน
topchef

3
ฉันไม่เห็นด้วยกับคำจำกัดความของ "win-win" อย่างสมบูรณ์ - เพียงแค่จับ Hibernate in Action ( stackoverflow.com/questions/96729/ … ) (และเป็น JPA 1 กับ JPA 1 และ JPA 2 จะดีขึ้นกว่าเดิม) เพื่อทำความเข้าใจพลังงานและครอบคลุมเทคโนโลยีนี้ มี
topchef

7
ฉันทำวิจัยเล็กน้อยและ Spring ไม่แนะนำ Spring DAO ให้อีกต่อไป ( static.springsource.org/spring/docs/3.0.x/… ): "รูปแบบการรวมที่แนะนำคือการใช้รหัส DAO กับ Hibernate, JPA และ JDO API แบบเดิม ไม่แนะนำให้ใช้เทมเพลต DAO แบบเก่าของ Spring อีกต่อไป "... นี่คือสิ่งที่คุณแนะนำใช่หรือไม่ ถ้าเป็นเช่นนั้นทำไมพวกเขาถึงไม่แนะนำ
User1

23

JDO ตายแล้ว

JDO ยังไม่ตายจริง ๆ ดังนั้นโปรดตรวจสอบข้อเท็จจริงของคุณ JDO 2.2 เปิดตัวในเดือนตุลาคม 2008 JDO 2.3 อยู่ระหว่างการพัฒนา

สิ่งนี้ได้รับการพัฒนาอย่างเปิดเผยภายใต้ Apache มีการเปิดตัวมากกว่า JPA และข้อมูลจำเพาะ ORM ของผลิตภัณฑ์นั้นยังอยู่ในขั้นตอนก่อนหน้าแม้แต่คุณสมบัติที่เสนอ JPA2


12
ผู้คนส่วนใหญ่ใช้มันอย่างแน่นอนซึ่งเป็นหลักฐานจากผู้ใช้จำนวนมากที่ DataNucleus มีไม่เคยรังเกียจ Xcalia, Kodo คุณพลาดแนวคิดพื้นฐานที่ JDO และ JPA ไม่ได้เติมเต็มตลาดเดียวกัน JPA เป็น RDBMS โดยเฉพาะ JDO เป็นผู้ไม่เชื่อเรื่องพระเจ้าและใช้สำหรับ RDBMS แต่ยังรวมถึง LDAP, XML, Excel, OODBMs และอื่น ๆ
DataNucleus

3
ฉันชอบปัจจัยที่ไม่ใช่ RDBMS โดยเฉพาะอย่างยิ่งกับความนิยมที่เพิ่มขึ้นของโซลูชันที่ไม่ใช่ RDBMS มันเป็นเรื่องใหญ่ ซึ่งหมายความว่าหาก JPA ไม่พัฒนาเร็วพอความพร้อมของ "ทางเลือกที่เปิดกว้างกว่า" และทางเลือกที่ยืดหยุ่น (JDO) หมายความว่าความนิยมของ JPA จะลดลงตามความจำเป็น ไม่ทราบข้อโต้แย้งทางเทคนิคที่ JDO เป็นที่สมบูรณ์มากขึ้นดีกว่าผู้ใหญ่หรือสิ่งอื่น - มันจะไม่เป็นเรื่องของการตั้งค่า มันสมเหตุสมผลแล้วที่ผู้ค้า RDBMS นั้นกำลังทำงานอย่างน่าสงสัยวันของการครอบงำตลาด RDBMS อาจสิ้นสุดลง
Manius

เรายังคงใช้ JDO / DataNucleus ในปี 2562! ตอนนี้มันขึ้นอยู่กับเวอร์ชัน 5.x และยังคงเต้นไฮเบอร์เนตสำหรับประสิทธิภาพของนักพัฒนาและประสิทธิภาพรันไทม์ เมื่อเร็ว ๆ นี้ฉันต้องทำการให้คำปรึกษากับเว็บแอพขนาดใหญ่โดยใช้ Hibernate และได้รับการเตือนถึงความเจ็บปวดที่ฉันได้รับเมื่อผู้ใช้ HIbernate และผู้สนับสนุนหลายปีที่ผ่านมาหัวหน้าทีมไม่เชื่อฉันเมื่อฉันบอกเธอว่าฟิลด์ BLOB ของเธอ ถูกเรียกอย่างกระตือรือร้นเสมอแม้ว่าจะถูกทำเครื่องหมายว่าดึงข้อมูลแบบขี้เกียจ การขาดความรู้ "ภายใต้ประทุน" อย่างสมบูรณ์โดยผู้เชี่ยวชาญ "ผู้มีประสบการณ์" ที่ประกาศตัวเองว่าเป็นผู้เชี่ยวชาญเรื่องไฮเบอร์เนตนั้นเป็นเรื่องน่ารำคาญ แต่คาดหวัง
Volksman


10

ฉันใช้ JPA (การใช้งาน OpenJPA จาก Apache ซึ่งใช้ฐานรหัส KODO JDO ซึ่งมีอายุ 5 ปีขึ้นไปและรวดเร็ว / เชื่อถือได้มาก) ใครก็ตามที่บอกให้คุณหลีกเลี่ยงข้อกำหนดจะให้คำแนะนำที่ไม่ดีแก่คุณ ฉันใส่เวลาและได้รับรางวัลแน่นอน ด้วย JDO หรือ JPA คุณสามารถเปลี่ยนผู้ขายด้วยการเปลี่ยนแปลงที่น้อยที่สุด (JPA มีการทำแผนที่ orm ดังนั้นเราจึงพูดน้อยกว่าหนึ่งวันเพื่อเปลี่ยนผู้ให้บริการ) ถ้าคุณมี 100+ โต๊ะแบบฉันนี่มันใหญ่มาก นอกจากนี้คุณยังได้รับการสร้างแคชในตัวด้วยการล้างแคชแบบคลัสเตอร์และทั้งหมดนี้เป็นสิ่งที่ดี SQL / Jdbc นั้นใช้ได้กับการค้นหาที่มีประสิทธิภาพสูง แต่การเก็บข้อมูลแบบโปร่งใสนั้นเหนือกว่าสำหรับการเขียนอัลกอริทึมและรูทีนการป้อนข้อมูลของคุณ ฉันมีคิวรี่ SQL ประมาณ 16 รายการในระบบทั้งหมดของฉัน (50k + บรรทัดของโค้ด)


8

ฉันได้ค้นหาตัวเองและไม่สามารถค้นหาความแตกต่างที่แข็งแกร่งระหว่างสอง ฉันคิดว่าตัวเลือกที่สำคัญคือการใช้งานที่คุณใช้ สำหรับตัวฉันเองฉันกำลังพิจารณาแพลตฟอร์มDataNucleusเพราะเป็นระบบเก็บข้อมูลที่ไม่เชื่อเรื่องพระเจ้าของทั้งคู่


6
+1 สำหรับ DataNucleus ไม่ใช่สำหรับคำตอบ
WolfmanDragon

8

ใครก็ตามที่บอกว่า JDO ตายไปแล้วพวกเขาก็รู้ว่ามันคือ FUD monger

JDO ยังมีชีวิตอยู่และดี ข้อมูลจำเพาะยังคงมีประสิทธิภาพเป็นผู้ใหญ่และก้าวหน้ากว่า JPA ที่อายุน้อยกว่าและมีข้อ จำกัด

หากคุณต้องการ จำกัด ตัวเองให้มีเฉพาะสิ่งที่มีอยู่ในมาตรฐาน JPA คุณสามารถเขียนถึง JPA และใช้ DataNucleus เป็นประสิทธิภาพสูงการดำเนินการคงอยู่ที่โปร่งใสมากขึ้นกว่าการใช้ JPA อื่น ๆ แน่นอนว่า DataNucleus ยังใช้มาตรฐาน JDO หากคุณต้องการความยืดหยุ่นและประสิทธิภาพของการสร้างแบบจำลองที่ JDO นำมาใช้


1
หรือคุณใช้การดำเนินการอื่น (ละเอียด) กับชุมชนที่ใหญ่กว่าและตอบสนองได้มากกว่า ใช่บางคนก็สนใจเช่นกัน
Pascal Thivent

1
และคุณพูดเกี่ยวกับ FUD> :) ตลกดี
Pascal Thivent

2
ความคิดเห็นของคุณดูเหมือนว่าฉันไม่ได้ใช้ทั้งไฮเบอร์เนตและ JDO
Volksman

2
เธรดนี้ดูเหมือนจะมีการอ้างอิงจำนวนมากจากคนสองคนถึง DataNucleus ที่ยอดเยี่ยม โปรดอย่าใช้สถานที่นี้เป็นแพลตฟอร์มโฆษณาของคุณ
TM

3
ไม่มีอะไรน่าประหลาดใจจาก Golfman ที่วางสิ่งที่หมดหวังทางการตลาดแบบเดียวกันซ้ำ ๆ กันในทุก ๆ กระทู้ที่เกี่ยวข้องกับ JPA หรือ DataNucleus (ซึ่งเขาใช้มาตั้งแต่ปี 1996ก่อนที่มันจะมีอยู่ !)
Pascal Thivent

2

ฉันใช้ Hibernate (การดำเนินการ JPA) และ JPOX (การดำเนินการ JDO) ในโครงการเดียวกัน JPOX ทำงานได้ดี แต่พบข้อผิดพลาดอย่างรวดเร็วในที่ซึ่งคุณสมบัติบางอย่างของ Java 5 นั้นไม่รองรับในเวลานั้น มีปัญหาในการเล่นที่ดีกับธุรกรรม XA ฉันสร้างสกีมาฐานข้อมูลจากวัตถุ JDO มันต้องการที่จะเชื่อมต่อกับฐานข้อมูลทุกครั้งที่น่ารำคาญถ้าการเชื่อมต่อ Oracle ของคุณไม่ทำงาน

จากนั้นเราเปลี่ยนเป็น Hibernate เราเล่นด้วยการใช้ JPA บริสุทธิ์สักครู่ แต่เราจำเป็นต้องใช้คุณสมบัติเฉพาะบางอย่างของไฮเบอร์เนตเพื่อทำแผนที่ การเรียกใช้รหัสเดียวกันในหลายฐานข้อมูลนั้นง่ายมาก ดูเหมือนว่าไฮเบอร์เนตจะแคชวัตถุอุกอาจหรือมีพฤติกรรมแคชแปลก ๆ ในบางครั้ง มีโครงสร้าง DDL ไม่กี่รายการที่ไฮเบอร์เนตไม่สามารถจัดการได้ดังนั้นจึงถูกกำหนดไว้ในไฟล์เพิ่มเติมที่เรียกใช้เพื่อเริ่มต้นฐานข้อมูล เมื่อฉันพบปัญหาไฮเบอร์เนตมักจะมีคนจำนวนมากที่พบปัญหาเดียวกันซึ่งทำให้ googling หาวิธีแก้ปัญหาได้ง่ายขึ้น ท้ายที่สุดดูเหมือนว่าไฮเบอร์เนตจะได้รับการออกแบบมาอย่างดีและน่าเชื่อถือ

ผู้เผชิญเหตุบางคนแนะนำให้ใช้ SQL กรณีการใช้งานนักฆ่าที่แท้จริงสำหรับการทำแผนที่วัตถุสัมพันธ์คือการทดสอบและพัฒนา ฐานข้อมูลที่สร้างขึ้นเพื่อจัดการปริมาณข้อมูลขนาดใหญ่มักมีราคาแพงและหรือติดตั้งได้ยาก พวกเขายากที่จะทดสอบด้วย มีฐานข้อมูล Java ในหน่วยความจำมากมายที่สามารถใช้ทดสอบ แต่โดยทั่วไปแล้วจะไม่มีประโยชน์สำหรับการผลิต ความสามารถในการใช้ฐานข้อมูลจริง แต่มีข้อ จำกัด จะเพิ่มประสิทธิภาพการพัฒนาและความน่าเชื่อถือของรหัส


1
เท่าที่ฉันสามารถบอกได้ JPOX เปลี่ยนชื่อเป็น DataNucleus (และมีการเผยแพร่ตั้งแต่นั้นมา)
Donal Fellows

2
คิดว่าคุณจะพบว่า DataNucleus มีข้อบกพร่องในการเปิดน้อยกว่าซอฟต์แวร์อื่น ๆ ที่คุณอ้างถึง คิดว่าคุณจะพบว่าการพัฒนา DataNucleus กำลังลดจำนวนข้อผิดพลาดในอัตราที่เร็วกว่าซอฟต์แวร์อื่นเช่นกัน
DataNucleus

1

ฉันสร้างตัวอย่าง WebApp ในเดือนพฤษภาคม 2012 ที่ใช้ JDO 3.0 และ DataNucleus 3.0 - ดูสิว่ามันสะอาดแค่ไหน: https://github.com/TorbenVesterager/BadAssWebApp

โอเคบางทีมันสะอาดเกินไปเล็กน้อยเพราะฉันใช้ POJO ทั้งฐานข้อมูลและไคลเอนต์ JSON แต่มันสนุก :)

PS: มีหมายเหตุประกอบ SuppressWarnings ไม่กี่ตัว (พัฒนาใน IntelliJ 11)

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