JPA และ Hibernate ต่างกันอย่างไร [ปิด]


680

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

ฉันมีประสบการณ์ในการใช้ iBatis และตอนนี้ฉันกำลังพยายามเรียนรู้ Hibernate หรือ JPA2 ฉันเลือกหนังสือ Pro JPA2 และมันอ้างอิงถึง "ผู้ให้บริการ JPA" ต่อไป ตัวอย่างเช่น:

หากคุณคิดว่าคุณสมบัติควรเป็นมาตรฐานคุณควรพูดและขอจากผู้ให้บริการ JPA ของคุณ

สิ่งนี้ทำให้ฉันสับสนดังนั้นฉันมีคำถามสองสามข้อ:

  • การใช้ JPA2 เพียงอย่างเดียวฉันสามารถดึงข้อมูลจากฐานข้อมูลได้โดยเพียงแค่ใส่คำอธิบายประกอบ POJO ของฉัน
  • ควรใช้ JPA2 กับ "ผู้ให้บริการ JPA" เช่น TopLink หรือ Hibernate หรือไม่ ถ้าเป็นเช่นนั้นแล้วประโยชน์ของการใช้ JPA2 + Hibernate เมื่อเปรียบเทียบกับ JPA2 เพียงอย่างเดียวหรือเปรียบเทียบกับ Hibernate เพียงอย่างเดียวคืออะไร
  • คุณช่วยแนะนำหนังสือ JPA2 เชิงปฏิบัติที่ดีได้ไหม "Pro JPA2" ดูเหมือนจะเป็นพระคัมภีร์และอ้างอิงถึง JPA2 (มันจะไม่เข้าสู่การค้นหาจนกว่าจะถึงช่วงครึ่งหลังของหนังสือ) มีหนังสือที่ใช้ปัญหา / แนวทางการแก้ปัญหากับ JPA2 หรือไม่?

2
คำถามเกี่ยวกับ“ ความแตกต่างระหว่าง JPA และไฮเบอร์เนต” ไม่ถูกต้อง Battle Hibernate กับ JPA นั้นไร้จุดหมาย ขอแนะนำให้ใช้ JPA กับ JPA API เพื่อหลีกเลี่ยงการใช้ ORM ที่แตกต่างกัน
BERGUIGA Mohamed Amine

18
@ Berguiga.M.Amine ถ้าเรารู้อยู่แล้วว่าคำถามข้างต้นไม่ถูกต้อง เราไม่ต้องการถามอีกแล้ว ฉันยังสนใจในหัวข้อนี้
ทำ Nhu Vy

ฉันมีความสับสนกับ JpaTemplate ที่ใช้ในฤดูใบไม้ผลิ "org.springframework.orm.jpa.JpaTemplate" มันมีฟังก์ชั่นของตัวเองเช่น persist (), find (), find (), merge () ฯลฯ แล้ววิธีการทำงานโดยไม่จำศีล?
nitin verma

@nitinverma: นั่นเป็นคำถามที่แยกต่างหาก หากคุณยังต้องการคำตอบฉันขอแนะนำให้คุณถามคำถามแยกต่างหากเพื่อดึงดูดความคิดเห็นเพิ่มเติม
Wouter

คำตอบ:


776

ในขณะที่คุณระบุ JPA เป็นเพียงข้อมูลจำเพาะหมายความว่าไม่มีการใช้งาน คุณสามารถใส่คำอธิบายประกอบชั้นเรียนของคุณได้มากเท่าที่คุณต้องการด้วยคำอธิบายประกอบ JPA อย่างไรก็ตามหากไม่มีการนำไปใช้งานจะไม่มีอะไรเกิดขึ้น คิดว่า JPA เป็นแนวทางที่ต้องปฏิบัติตามหรืออินเทอร์เฟซในขณะที่การใช้งาน JPA ของไฮเบอร์เนตเป็นรหัสที่ตรงกับ API ตามที่กำหนดโดยข้อกำหนด JPA และให้การทำงานภายใต้ประทุน

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

สำหรับรายละเอียดเพิ่มเติมอ่านของฉันรายการบล็อก


5
ดังนั้นเมื่อคุณใช้ Hibernate กับ JPA คำอธิบายประกอบ {java.persistence} จะทำงานหรือคุณจะต้องใช้คำอธิบายประกอบ {org.hibernate}
Amruta

62
ฉันแค่อยากจะเพิ่มว่าการแทนที่ ORM หนึ่งด้วยอันที่แตกต่างกันเป็นโอกาสที่หายากมากดังนั้นคุณอาจจะไม่ได้รับผลประโยชน์นี้จากการใช้ JPA สิ่งที่คุณจะได้รับจาก JPA คือโปรโตคอลมาตรฐานการตั้งชื่อและการประชุมอื่น ๆ ที่คุณสามารถใช้เพื่อสื่อสารกับผู้อื่น
pubsy

3
@pubsy ฉันเห็นด้วย แต่ในหลักการที่เป็นหนึ่งในจุดขายของสเปค
Kevin Bowersox

6
@Amruta เพื่อตอบคำถามของคุณเมื่อมีใครกำลังใช้ Hibernate กับ JPA คำอธิบายประกอบ {java.persistence} จะทำงานและไม่จำเป็นต้องใช้คำอธิบายประกอบ {org.hibernate}
ผู้เรียน

3
@JavaGeek ที่เป็นจริงตราบใดที่โค้ดของคุณใช้อินเตอร์เฟสที่กล่าวถึงใน JPA หากมีการใช้คุณสมบัติเฉพาะเพื่อจำศีลแล้วพวกเขาจะต้องใช้org.hibernateคำอธิบายประกอบ เพิ่มเติมเกี่ยวกับเรื่องนี้
Suryavanshi

632

JPA คือการเต้นรำไฮเบอร์เนตคือนักเต้น


189
JPA คือศิลปะ, ไฮเบอร์เนตเป็นศิลปิน
โชคดี

10
ฉันชอบอารมณ์ขันนี้ :) JPA เป็นผู้กำกับ Hibernate เป็นนักแสดง
user3278897

7
แต่ Dancer (Hibernate) สามารถแสดงได้โดยไม่ต้องเต้น (JPA) ใช่ไหม: /
RevanthKrishnaKumar V.

3
คำตอบนี้ไม่ได้อธิบายอะไรเลยเพียงแค่พูดคลุมเครือ
Amir Kost

11
อุปมานี้ไม่ได้เพิ่มความเข้าใจ หากคุณทราบถึงความแตกต่างคุณจะพบว่ามันน่าสนุก หากคุณไม่ทราบความแตกต่างคุณจะยังไม่ทราบ
Nick Volynkin

158

บางสิ่งยากเกินกว่าจะเข้าใจโดยไม่มีมุมมองทางประวัติศาสตร์ของภาษาและความเข้าใจของ JCP

บ่อยครั้งที่มีบุคคลที่สามที่พัฒนาแพ็คเกจที่ทำหน้าที่หรือเติมช่องว่างที่ไม่ได้เป็นส่วนหนึ่งของ JDK อย่างเป็นทางการ ด้วยเหตุผลต่าง ๆ ที่ฟังก์ชั่นอาจกลายเป็นส่วนหนึ่งของ Java JDK ผ่าน JCP (กระบวนการชุมชน Java)

Hibernate (ในปี 2003) จัดเตรียมวิธีในการสรุป SQL และอนุญาตให้นักพัฒนาคิดเพิ่มเติมในแง่ของวัตถุที่คงอยู่ (ORM) คุณแจ้งการจำศีลเกี่ยวกับวัตถุ Entity ของคุณและจะสร้างกลยุทธ์โดยอัตโนมัติเพื่อคงไว้ ไฮเบอร์เนตจัดเตรียมการนำไปใช้เพื่อทำสิ่งนี้และ API เพื่อขับเคลื่อนการนำไปใช้งานผ่านการกำหนดค่า XML หรือคำอธิบายประกอบ

ปัญหาพื้นฐานในตอนนี้ก็คือรหัสของคุณจะถูกผนวกเข้ากับผู้จำหน่ายที่เฉพาะเจาะจง (Hibernate) อย่างเข้มงวดสำหรับสิ่งที่ผู้คนจำนวนมากคิดว่าควรเป็นเรื่องทั่วไป ดังนั้นความจำเป็นในการคงอยู่ของ API ทั่วไป

ในขณะเดียวกัน JCP ที่มีการป้อนข้อมูลจำนวนมากจาก Hibernate และผู้จำหน่ายเครื่องมือ ORM อื่น ๆ กำลังพัฒนา JSR 220 (Java Specification Request) ซึ่งส่งผลให้ JPA 1.0 (2006) และในที่สุด JSR 317 ซึ่งเป็น JPA 2.0 (2009) นี่เป็นข้อมูลจำเพาะของ Java Persistence API ทั่วไป API มีไว้ใน JDK เป็นชุดของอินเทอร์เฟซเพื่อให้คลาสของคุณสามารถพึ่งพา javax.persistence และไม่ต้องกังวลเกี่ยวกับผู้จำหน่ายเฉพาะที่ทำหน้าที่เก็บวัตถุของคุณ นี่เป็นเพียง API เท่านั้นไม่ใช่การใช้งาน ตอนนี้ไฮเบอร์เนตกลายเป็นหนึ่งในผู้ค้าหลายรายที่ใช้ข้อกำหนด JPA 2.0 คุณสามารถโค้ดไปยัง JPA และเลือกผู้ขาย ORM ที่สอดคล้องกับความต้องการของคุณ

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

ที่มา: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


2
ส่วนประวัติศาสตร์ที่ดี ในขณะที่คำตอบอื่น ๆ เพียงทำซ้ำสิ่งที่อยู่ในคำถาม
Robert

1
ขอบคุณสำหรับ thoses enensionsening precisions คุณบอกว่า JPA ทำเพราะแอปพลิเคชันที่เชื่อมต่อกับไฮเบอร์เนตอย่างหนัก แต่มันไม่ใช่ปัญหาที่ไม่สิ้นสุดใช่ไหม ตอนนี้แอปพลิเคชันไม่ได้เชื่อมโยงกับ JPA อย่างแน่นหนาแทนหรือไม่ ประโยชน์ที่แท้จริงของที่นี่คืออะไร? ฉันได้เห็น Hibernate เป็นชั้นนามธรรม ...
Aphax

4
@Aphax แน่นอนและเมื่อคุณโค้ดไฟล์. java คุณจะเชื่อมโยงกับ Java อย่างแน่นหนาดังนั้นถ้าฉันต้องการเปลี่ยนเป็น Python ในวันพรุ่งนี้ล่ะ
Smutje

100

JPAเป็นอินเทอร์เฟซในขณะที่ไฮเบอร์เนตคือการนำไปใช้

ตามเนื้อผ้ามีโซลูชั่น Java ORM หลายตัว:

การติดตั้งแต่ละครั้งจะกำหนดนิยามการจับคู่หรือ API ของลูกค้า กลุ่มผู้เชี่ยวชาญ JPA รวบรวมเครื่องมือที่ดีที่สุดทั้งหมดและสร้างมาตรฐาน Java Persistence API

API การติดตามาตรฐานนั้นสะดวกมากจากมุมมองของลูกค้าทำให้ค่อนข้างง่ายในการสลับการใช้งานหนึ่งไปสู่อีกการใช้งานหนึ่ง (แม้ว่าในทางปฏิบัติมันไม่ง่ายอย่างนั้นเพราะในโครงการขนาดใหญ่คุณจะต้องใช้คุณสมบัติที่ไม่ได้มาตรฐานเท่านั้น) .

JPA มาตรฐานได้ผลักดันการแข่งขัน Java ORM ไปสู่ระดับใหม่และสิ่งนี้สามารถนำไปสู่การใช้งานที่ดีขึ้น

ตามที่อธิบายไว้ในหนังสือของฉัน, การคงอยู่ของ Java ประสิทธิภาพสูง , ไฮเบอร์เนตมีคุณสมบัติที่ยังไม่ได้รับการสนับสนุนโดย JPA :

คุณสมบัติพิเศษเหล่านี้ช่วยให้ Hibernate สามารถตอบสนองความต้องการการคงอยู่จำนวนมากที่ต้องการโดยแอปพลิเคชันระดับองค์กรขนาดใหญ่


นี่เป็นสิ่งที่ดีฉันไม่ทราบเกี่ยวกับเครื่องมือ ORM อื่น ๆ ก่อนหน้านี้
Avdhut

คำตอบที่ดีและฉันสนุกกับหนังสือเล่มนี้อย่างมาก! ขอบคุณสำหรับการปล่อยมัน!
JonasJSchreiber

ขอบคุณที่สนุกกับหนังสือJava Persistence ประสิทธิภาพสูงของฉัน
Vlad Mihalcea

~ JPA นี้เป็นอินเทอร์เฟซในขณะที่ Hibernate กำลังนำไปใช้งาน
Eddie B

57

จากวิกิพีเดีย

แรงจูงใจในการสร้าง Java Persistence API

ผู้พัฒนา Java องค์กรจำนวนมากใช้วัตถุถาวรน้ำหนักเบาที่จัดทำโดยกรอบโอเพนซอร์ซหรือ Data Access Objects แทน entity beans: entity beans และ enterprise beans มีชื่อเสียงว่ามีน้ำหนักมากเกินไปและซับซ้อนเกินไปและสามารถใช้ใน Java EE application servers เท่านั้น คุณลักษณะหลายอย่างของเฟรมเวิร์กการคงอยู่ของบุคคลที่สามถูกรวมเข้ากับ Java Persistence API และในปี 2006 โครงการเช่น Hibernate (เวอร์ชัน 3.2) และ OpenLink Source TopLink Essentials กลายเป็นการนำมาใช้ของ Java Persistence API

ดังที่ได้อธิบายไว้ในหน้า JCPลิงค์ Eclipse เป็นการใช้งานอ้างอิงสำหรับ JPA ลองดูที่คำตอบนี้เพื่อรับข้อมูลเพิ่มเติม

JPAเองมีคุณสมบัติที่จะใช้สำหรับกรอบ ORM มาตรฐาน ตั้งแต่ JPA เป็นส่วนหนึ่งของ Java EE สเปคที่คุณสามารถใช้ JPA คนเดียวในโครงการและมันควรจะทำงานกับเซิร์ฟเวอร์ที่รองรับ Java EE ใช่เซิร์ฟเวอร์เหล่านี้จะมีการนำไปใช้งานสำหรับ JPA spec

Hibernate เป็นกรอบORM ที่ได้รับความนิยมมากที่สุดเมื่อJPAได้แนะนำ hibernate ให้เป็นไปตามข้อกำหนดJPA นอกเหนือจากชุดข้อมูลจำเพาะพื้นฐานที่ควรปฏิบัติตามไฮเบอร์เนตยังมีสิ่งเพิ่มเติมมากมาย


3
ที่กล่าวว่าคุณสามารถใช้ JPA เพียงอย่างเดียวในโครงการ คุณหมายถึงโดยไม่ใช้ Hibernate, TopLink หรือการใช้ JPA อื่น ๆ หรือไม่?
abbas

2
@abbas ใช่ ข้อมูลจำเพาะ Java EE ใช้ JPA เท่านั้น หากคุณเพิ่มการจำศีลมันจะให้คุณสมบัติเพิ่มเติมบางอย่าง
ManuPK

1
ฉันได้ยินมาว่า JPA เป็นเพียงส่วนต่อประสาน / ข้อมูลจำเพาะ ถ้าเราใช้ JPA เพียงอย่างเดียวในโครงการถ้าเช่นนั้นแล้วจะนำไปใช้ในการดำเนินการจากที่ใด
abbas

@abbas ขอบคุณสำหรับความคิดเห็น ฉันได้เพิ่มรายละเอียดเพิ่มเติมในคำตอบ หวังว่านี่จะช่วยได้
ManuPK

1
@Forhad จะต้องมีการนำไปใช้เสมอไม่ว่าจะฝังอยู่ในสถาปัตยกรรมเซิร์ฟเวอร์บางส่วนหรือไม่สำคัญก็ไม่มีวิธีใดที่จะดาวน์โหลดไลบรารี่ JPA บางส่วนและทำให้มันคงอยู่ต่อไป
Kevin Bowersox

15

JPA เป็นเพียงสเปคที่ต้องใช้งานอย่างเป็นรูปธรรม เริ่มต้นการดำเนินการพยากรณ์ให้เป็น "EclipseLink" ในขณะนี้ (Toplink บริจาคโดยมูลนิธิ Oracle to Eclipse เพื่อรวมเข้ากับ eclipselink)

(การอ้างอิง: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

การใช้ Eclipselink เราสามารถมั่นใจได้ว่าโค้ดนั้นสามารถพกพาไปได้ทุกเมื่อหากจำเป็น ไฮเบอร์เนตเป็นการนำ JPA ไปใช้อย่างสมบูรณ์ + มากขึ้น (เรียงลำดับของ JPA Plus) Hibernate เป็นชุด JPA ที่ยอดเยี่ยมพร้อมฟังก์ชั่นเฉพาะบางอย่างของ Hibernate ดังนั้นแอปที่พัฒนาใน Hibernate อาจไม่สามารถใช้งานร่วมกันได้เมื่อเปลี่ยนไปใช้การดำเนินการอื่น ยังคงจำศีลเป็นทางเลือกของนักพัฒนาส่วนใหญ่ที่ใช้ JPA และใช้กันอย่างแพร่หลาย

การใช้งาน JPA อื่นคือ OpenJPA (openjpa.apache.org) ซึ่งเป็นส่วนเสริมของการใช้งาน Kodo


15

JPA:เป็นเหมือนส่วนต่อประสานและไม่มีการใช้งานอย่างเป็นรูปธรรมในการใช้ฟังก์ชั่นที่มีใน JPA

Hibernate:เป็นเพียงผู้ให้บริการ JPAซึ่งมีการใช้งานฟังก์ชั่นใน JPA และสามารถมีฟังก์ชั่นพิเศษบางอย่างที่อาจไม่มีใน JPA

เคล็ดลับ: คุณสามารถใช้

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

คอมโบ 1 : ใช้เมื่อคุณรู้สึกว่าไฮเบอร์เนตของคุณไม่ให้ประสิทธิภาพที่ดีขึ้นและต้องการเปลี่ยนผู้ให้บริการ JPA ในเวลานั้นคุณไม่ต้องเขียน JPA อีกครั้ง คุณสามารถเขียนผู้ให้บริการ JPA รายอื่น ... และสามารถเปลี่ยนแปลงได้บ่อยเท่าที่คุณสามารถ

คอมโบ 2 : ใช้น้อยกว่ามากเมื่อคุณไม่เปลี่ยนผู้ให้บริการ JPA ของคุณในราคาใด

เยี่ยมชมhttp://blog-tothought.rhcloud.com//post/2ที่ซึ่งความสับสนของคุณจะชัดเจน


11

JPA เป็นอินเทอร์เฟซไฮเบอร์เนตเป็นการนำไปใช้งานหนึ่งของอินเตอร์เฟส


2
และยิ่งกว่านั้นไฮเบอร์เนตยังเพิ่มคุณสมบัติ / วิธีการเพิ่มเติม
rai.skumar

10

JPA เป็นข้อกำหนดในการสร้างมาตรฐาน ORM-API Hibernate เป็นผู้จัดจำหน่ายการติดตั้ง JPA ดังนั้นหากคุณใช้ JPA กับไฮเบอร์เนตคุณสามารถใช้ JPA API มาตรฐานได้ดังนั้นไฮเบอร์เนตจะอยู่ภายใต้ประทุนซึ่งให้ฟังก์ชั่นที่ไม่ได้มาตรฐาน ดูhttp://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/และhttp://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/


5

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

หากคุณกำลังใช้ Hibernate หรือผู้ให้บริการรายอื่นแทนที่จะเป็น JPA คุณจะไม่สามารถย้ายไปยังโหมด Hibernate ไปยัง EclipseLink หรือ OpenJPA ไปยัง Hibernate ได้อย่างง่ายดาย แต่หากคุณใช้ JPA มากกว่าที่คุณต้องเปลี่ยนการระบุในไฟล์ XML แบบถาวร JPA


4

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

ดังนั้นทางเลือกของคุณคือ: จำศีลเชื่อมโยง ฯลฯ ...

ข้อดีของ JPA คือช่วยให้คุณสามารถสลับการใช้งานได้หากต้องการ ข้อเสียคือการที่ hibernate ดั้งเดิม / toplink / etc ... API อาจมีฟังก์ชันการทำงานที่ข้อกำหนด JPA ไม่สนับสนุน


4

ในขณะที่ JPA เป็นข้อมูลจำเพาะ Hibernate เป็นผู้ให้บริการการใช้งานที่ปฏิบัติตามกฎที่กำหนดไว้ในข้อกำหนด


3

Java - ความเป็นอิสระไม่เพียง แต่มาจากระบบปฏิบัติการ แต่ยังมาจากผู้จำหน่ายด้วย

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


3

JPA เป็นข้อกำหนดที่คุณใช้ในชั้นข้อมูลของคุณเพื่อดำเนินการ opertations db หรือการแมปและงานอื่น ๆ ที่จำเป็น

เนื่องจากเป็นเพียงข้อมูลจำเพาะคุณจึงต้องมีเครื่องมือในการปรับใช้ เครื่องมือนั้นสามารถเป็นได้ทั้ง Hibernate, TopLink, iBatis, spring-data เป็นต้น

คุณไม่จำเป็นต้องใช้ JPA หากคุณใช้ Hibernate ในชั้นข้อมูลของคุณ แต่ถ้าคุณใช้ข้อมูลจำเพาะ JPA สำหรับ Hibernate แล้วมันจะทำการสลับไปใช้เครื่องมือ ORM อื่น ๆ เช่น iBatis, TopLink ได้ง่ายในอนาคตเนื่องจากข้อกำหนดเป็นเรื่องธรรมดาสำหรับคนอื่นเช่นกัน

* ( ถ้าคุณจำได้import javax.persistence.*;คุณใช้คำอธิบายประกอบสำหรับการทำแผนที่ OR (เช่น @Id, @Column, @GeneratedValue ฯลฯ ) ใน Hibernate นั่นคือที่ที่คุณใช้ JPA ภายใต้ Hibernate คุณสามารถใช้ @Query & คุณสมบัติอื่น ๆ ของ JPA ได้ ดี )


2

JPA เป็นข้อกำหนด Java API ซึ่งอธิบายการจัดการข้อมูลเชิงสัมพันธ์ในแอปพลิเคชันโดยใช้แพลตฟอร์ม Java โดยที่ Hibernate เป็นไลบรารี ORM (Object Relational Mapping) ซึ่งเป็นไปตามข้อกำหนด JPA

คุณสามารถคิดว่า JPA เป็นชุดของกฎที่ใช้โดยไฮเบอร์เนต


2

JPA คือ JSR เช่นข้อกำหนดคุณสมบัติ Java เพื่อใช้การทำแผนที่วัตถุสัมพันธ์ซึ่งไม่มีรหัสเฉพาะสำหรับการนำไปใช้ มันกำหนดชุดของกฎบางอย่างสำหรับการเข้าถึงการคงอยู่และการจัดการข้อมูลระหว่างวัตถุ Java และฐานข้อมูลเชิงสัมพันธ์ด้วยการแนะนำ EJB ก็ถูกแทนที่ด้วยเนื่องจากถูกวิพากษ์วิจารณ์ว่าหนักหน่วงโดยชุมชนนักพัฒนา Java Hibernate เป็นหนึ่งในวิธีที่ JPA สามารถนำไปใช้โดยใช้แนวทาง te. Hibernate เป็นบริการการสืบค้นวัตถุ / ความสัมพันธ์ที่มีประสิทธิภาพสูงและการสืบค้นซึ่งได้รับใบอนุญาตภายใต้สัญญาอนุญาตสาธารณะทั่วไปของ Lesser General (LGPL) ของ GNU สามารถสลับการใช้ JPA ของไฮเบอร์เนตสำหรับการดำเนินการตามข้อกำหนด JPA อีกครั้ง


1

JPA เป็นเพียงสเปคที่ต้องมีการใช้งานที่เป็นรูปธรรม การใช้งานเริ่มต้นโดย oracle คือ "Eclipselink" ในขณะนี้ มูลนิธิ Top to Oracle บริจาคให้กับ Eclipse เพื่อรวมเข้ากับ eclipselink

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

การติดตั้ง JPA อื่นคือ OpenJPA ซึ่งเป็นส่วนเสริมของการใช้งาน Kodo

JPA กับไฮเบอร์เนต


1

ฉันพยายามอธิบายด้วยคำพูดที่ง่ายมาก

สมมติว่าคุณต้องการรถเพราะเราทุกคนรู้ว่าพวกเขาเป็นผู้ผลิตหลายระดับเช่น MERCEDES, BMW, AUDI และอื่น ๆ

ตอนนี้ในแถลงการณ์ข้างต้น CAR (เป็นสเปค) เนื่องจากรถทุกคันมีคุณสมบัติทั่วไปเช่นสิ่งของที่มี 4 ล้อและสามารถขับบนถนนได้รถยนต์ ... ดังนั้นมันจึงเหมือนกับ JPA และ MERCEDES, BMW, AUDI และอื่น ๆ เพียงแค่ใช้คุณสมบัติรถยนต์ทั่วไปและเพิ่มฟังก์ชั่นการใช้งานตามฐานลูกค้าของพวกเขาดังนั้นพวกเขาจึงใช้ข้อมูลจำเพาะรถยนต์เช่น hibernate, iBATIS เป็นต้น

ดังนั้นโดยคุณสมบัติทั่วไปนี้ไปที่ jpa และ hibernate เป็นเพียงการดำเนินการตามความต้องการ jboss ของพวกเขา

อีก 1 สิ่ง

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

ดังนั้นส่วนใหญ่เราใช้การจำศีลด้วยเทคโนโลยีประเภท JPA ในกรณีที่เราต้องการเปลี่ยนการใช้งานของเราตามความต้องการของลูกค้าและคุณจะเขียนรหัสน้อยลงเนื่องจากคุณสมบัติทั่วไปบางอย่างเกี่ยวข้องกับ JPA หากใครบางคนยังไม่ชัดเจนคุณสามารถแสดงความคิดเห็นในฐานะ im ใหม่ใน stack overflow

ขอบคุณ


ขอบคุณสำหรับคำแนะนำ
rajiv baghel

0

JPA เป็นเพียงข้อกำหนดในขณะที่ไฮเบอร์เนตเป็นหนึ่งในผู้ให้บริการ JPA นั่นคือการจำศีลกำลังดำเนินการสิ่งต่าง ๆ ที่กล่าวถึงในสัญญา JPA


0

JPA หรือ Java Persistence API เป็นข้อกำหนดมาตรฐานสำหรับการใช้งาน ORM ในขณะที่ไฮเบอร์เนตเป็นการนำ ORM มาใช้จริงหรือกรอบงาน


-1

JPA เป็น Java Persistence API ซึ่งระบุเฉพาะข้อมูลจำเพาะสำหรับ API หมายความว่าชุดของกฎและแนวทางในการสร้าง API หากกล่าวว่าบริบทอื่นมันเป็นชุดของมาตรฐานที่ให้เสื้อคลุมสำหรับการสร้าง API เหล่านั้นสามารถใช้สำหรับการเข้าถึงวัตถุนิติบุคคลจากฐานข้อมูล JPA จัดทำโดย oracle เมื่อเราจะทำการเข้าถึงฐานข้อมูลเราจำเป็นต้องมีการนำไปปฏิบัติ หมายถึง JPA ระบุแนวทางเฉพาะสำหรับการใช้ API Hibernate เป็นผู้ให้บริการ / ผู้ขาย JPA ที่รับผิดชอบในการนำ API ดังกล่าวมาใช้ เช่นเดียวกับ Hibernate TopLink และ Open JPA เป็นตัวอย่างของผู้ให้บริการ JPA API ดังนั้นเราจึงใช้ API มาตรฐาน JPA ที่ระบุผ่านการไฮเบอร์เนต


-2

JPA พูดอย่างชัดเจนว่าเป็นเพียงส่วนต่อประสาน, Hibernate / TopLink - class (เช่นการนำอินเตอร์เฟสไปใช้)

คุณต้องมีการใช้อินเตอร์เฟสเพื่อใช้อินเตอร์เฟส แต่คุณสามารถใช้คลาสผ่านอินเทอร์เฟซเช่นใช้ Hibernate ผ่าน JPA API หรือคุณสามารถใช้งานได้โดยตรงเช่นใช้ Hibernate โดยตรงไม่ใช่ผ่าน JPA API บริสุทธิ์

หนังสือที่ดีเกี่ยวกับ JPA คือ "การคงอยู่ของ Java ที่มีประสิทธิภาพสูง" ของ Vlad Mihalcea

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