อะไรคือความแตกต่างระหว่าง Hibernate และ Spring Data JPA


207

อะไรคือความแตกต่างที่สำคัญระหว่าง Hibernate และ Spring Data JPA เมื่อใดที่เราไม่ควรใช้ Hibernate หรือ Spring Data JPA นอกจากนี้เมื่อใดที่เท็มเพลต Spring JDBC อาจทำงานได้ดีกว่า Hibernate / Spring Data JPA


7
@ NeilStockton ถามเพื่อเปรียบเทียบระหว่างสองเทคโนโลยีไม่ได้ขอความคิดเห็น
Philip Rego

คำตอบ:


262

Hibernate เป็นการนำ JPA ไปใช้ในขณะที่ Spring Data JPA เป็นนามธรรมของการเข้าถึงข้อมูล JPA Spring Data JPA ไม่สามารถทำงานได้หากไม่มีผู้ให้บริการ JPA

Spring Data นำเสนอโซลูชันสำหรับรูปแบบDDDRepositoryหรือการGenericDaoใช้งานที่กำหนดเองแบบดั้งเดิม นอกจากนี้ยังสามารถสร้างแบบสอบถาม JPA ในนามของคุณผ่านระเบียบวิธีชื่อ

ด้วย Spring Data คุณสามารถใช้ Hibernate, Eclipse Link หรือผู้ให้บริการ JPA อื่น ๆ ประโยชน์ที่น่าสนใจมากของการใช้ฤดูใบไม้ผลิหรือ Java EE คือการที่คุณสามารถควบคุมขอบเขตการทำธุรกรรม declaratively ใช้@Transactionalคำอธิบายประกอบ

Spring JDBC นั้นมีน้ำหนักเบากว่ามากและมีไว้สำหรับการสอบถามดั้งเดิมและหากคุณต้องการใช้ JDBC เพียงอย่างเดียวคุณควรใช้ Spring JDBC เพื่อจัดการกับ verbosity ของ JDBC

ดังนั้นข้อมูลไฮเบอร์เนตและสปริงจึงเป็นส่วนเสริมมากกว่าคู่แข่ง


52
ดังนั้นสิ่งนี้หมายความว่า Spring Data JPA ไม่สามารถมีอยู่ได้ด้วยตัวเอง? นั่นคือภายใต้ประทุนใช้ผู้ให้บริการ JPA หนึ่งราย (เช่น Hibernate, Eclipselink หรือผู้ให้บริการ JPA อื่น ๆ )
CuriousMind

ฉันหมายถึงถ้าฉันใช้โหมดไฮเบอร์เนตเท่านั้นมีการกำหนดค่าระดับไฮเบอร์เนตเพียงเล็กน้อยถ้าฉันใช้ข้อมูลฤดูใบไม้ผลิ jpa นั่นดูง่ายกว่าไฮเบอร์เนตมาก ในแง่นี้ฉันถามคำถามนั้นกับคุณ
Asif Mushtaq

1
แม่นยำยิ่งขึ้นจนถึงตอนนี้ทุกอย่างทำงานได้ดีที่คุณต้องการเพียงเข้าใจระดับสูงสุดคือ Spring Data JPA ด้วยข้อยกเว้นแรกคุณอาจต้องทราบระดับล่างเช่น Hibernate, JDBC และฐานข้อมูล
เครื่องบินทิ้งระเบิด Marmite

138

มี 3 สิ่งต่าง ๆ ที่เราใช้อยู่ที่นี่:

  1. JPA: Java persistence api ซึ่งจัดเตรียมข้อมูลจำเพาะสำหรับการคงอยู่การอ่านการจัดการข้อมูลจากอ็อบเจ็กต์ java ของคุณไปยังความสัมพันธ์ในฐานข้อมูล
  2. Hibernate: มีผู้ให้บริการหลากหลายซึ่งใช้งาน jpa ไฮเบอร์เนตเป็นหนึ่งในนั้น ดังนั้นเราจึงมีผู้ให้บริการรายอื่นเช่นกัน แต่ถ้าใช้ jpa กับฤดูใบไม้ผลิจะช่วยให้คุณเปลี่ยนไปใช้ผู้ให้บริการที่แตกต่างกันในอนาคต
  3. Spring Data JPA: นี่คืออีกชั้นหนึ่งของ jpa ที่สปริงให้เพื่อให้ชีวิตของคุณง่ายขึ้น

ดังนั้นให้เข้าใจว่าข้อมูลฤดูใบไม้ผลิ jpa และฤดูใบไม้ผลิ + จำศีลทำงาน -


Spring Data JPA:

สมมติว่าคุณกำลังใช้สปริง + ไฮเบอร์เนตสำหรับใบสมัครของคุณ ตอนนี้คุณต้องมีอินเทอร์เฟซ dao และการใช้งานที่คุณจะเขียนการดำเนินการ crud โดยใช้ SessionFactory of hibernate สมมติว่าคุณกำลังเขียนคลาส dao สำหรับคลาสพนักงานพรุ่งนี้ในแอปพลิเคชันของคุณคุณอาจต้องเขียนการดำเนินการที่ไม่ซับซ้อนสำหรับหน่วยงานอื่น ๆ ดังนั้นจึงมีรหัสสำเร็จรูปมากมายที่เราสามารถดูได้ที่นี่

ขณะนี้ข้อมูล Spring jpa อนุญาตให้เรากำหนดอินเตอร์เฟส dao โดยขยายที่เก็บ (crudrepository, jparepository) เพื่อให้สามารถใช้งาน dao ได้ที่รันไทม์ คุณไม่จำเป็นต้องเขียนการติดตั้ง dao อีกต่อไปนั่นคือวิธีที่ข้อมูล jpa ทำให้ชีวิตของคุณง่ายขึ้น


3
ดังนั้นการนำ Spring Data JPA ไปใช้งานนั้นเป็นสิ่งที่จำศีล? เพราะเมื่อฉันใช้ PagingAndSortingRepository จะแสดงบันทึกการไฮเบอร์เนตในคอนโซล
Vicky

2
Spring Data JPA ใช้การดำเนินการไฮเบอร์เนตโดยค่าเริ่มต้น .. หากคุณเห็นการพึ่งพาสกรรมกริยาของ spring-boot-starter-data-jpa คุณสามารถดู hibernate-core ได้ที่นั่น
IamVickyAV

28

ฉันไม่เห็นด้วยกับ SpringJPA ที่ทำให้การแสดงสดง่าย ใช่มันมีบางคลาสและคุณสามารถสร้าง DAO แบบง่าย ๆ ได้ แต่อันที่จริงมันคือทั้งหมดที่คุณสามารถทำได้ หากคุณต้องการทำอะไรมากกว่า findById () หรือบันทึกคุณต้องผ่านนรก:

  • ไม่มีการเข้าถึง EntityManager ในคลาส org.springframework.data.repository (นี่คือคลาส JPA พื้นฐาน!)
  • การจัดการธุรกรรมของตัวเอง (ห้ามการทำธุรกรรมจำศีล)
  • ปัญหาใหญ่กับการกำหนดค่าแหล่งข้อมูลมากกว่าหนึ่งรายการ
  • ไม่มีการรวมแหล่งข้อมูล (HikariCP ต้องใช้เป็นห้องสมุดบุคคลที่สาม)

เหตุใดการจัดการธุรกรรมของตัวเองจึงเป็นข้อเสีย เนื่องจาก Java 1.8 อนุญาตให้ใช้วิธีการเริ่มต้นในอินเตอร์เฟสธุรกรรมที่ใช้คำอธิบายประกอบของ Spring จึงไม่สามารถใช้งานได้ง่าย

น่าเสียดายที่ SpringJPA ขึ้นอยู่กับการสะท้อนและบางครั้งคุณจำเป็นต้องชี้ชื่อวิธีหรือแพ็คเกจเอนทิตีลงในคำอธิบายประกอบ (!) นั่นเป็นสาเหตุที่การปรับเปลี่ยนใหม่ทำให้เกิดความผิดพลาดครั้งใหญ่ น่าเศร้าที่ @ ธุรกรรมใช้งานได้กับ DS หลักเท่านั้น :( ดังนั้นหากคุณมีแหล่งข้อมูลมากกว่าหนึ่งรายการโปรดจำไว้ว่า - ธุรกรรมใช้งานได้กับแหล่งข้อมูลหลักเท่านั้น :)

อะไรคือความแตกต่างที่สำคัญระหว่าง Hibernate และ Spring Data JPA

Hibernate คือ JPA compatibile, SpringJPA Spring compatibile HibernateJPA DAO ของคุณสามารถใช้กับ JavaEE หรือ Hibernate Standalone เมื่อ SpringJPA สามารถใช้ภายใน Spring - SpringBoot เป็นต้น

เมื่อใดที่เราไม่ควรใช้ Hibernate หรือ Spring Data JPA นอกจากนี้เมื่อใดที่เท็มเพลต Spring JDBC อาจทำงานได้ดีกว่า Hibernate / Spring Data JPA

ใช้ Spring JDBC เฉพาะเมื่อคุณต้องการใช้ Joins มากหรือเมื่อคุณต้องการใช้ Spring ที่มีการเชื่อมต่อหลายแหล่งข้อมูล โดยทั่วไปให้หลีกเลี่ยง JPA สำหรับการเข้าร่วม

แต่คำแนะนำทั่วไปของฉันให้ใช้โซลูชันสดใหม่ - Daobab ( http://www.daobab.io ) Daobab เป็น Java ของฉันและ JPA engine integrator และฉันเชื่อว่ามันจะช่วยคุณได้มากในงานของคุณ :)


2
Daobab จริงเหรอ? หากคุณไม่ชอบความปลอดภัยประเภท jpql (ฉันไม่ชอบ) JPA มีเกณฑ์ความปลอดภัยประเภท API ... JPA มาตรฐานดีกว่าทางเลือกที่ไม่ดีนั้น
ymajoros

8

Spring Dataเป็นห้องสมุดความสะดวกสบายJPAที่อยู่เหนือสิ่งที่เป็นนามธรรมและนำความมหัศจรรย์ของฤดูใบไม้ผลิ (เช่นนั้นหรือไม่) ไปใช้กับร้านค้าที่ติดตา ส่วนใหญ่จะใช้สำหรับการทำงานกับฐานข้อมูลเชิงสัมพันธ์ ในระยะสั้นจะช่วยให้คุณประกาศอินเทอร์เฟซที่มีวิธีการเช่นfindByNameOrderByAge(String name);นั้นจะถูกแยกวิเคราะห์ใน runtime และแปลงเป็นJPAแบบสอบถามที่เหมาะสม

การวางตำแหน่งบนยอดของJPAการใช้งานที่ดึงดูดสำหรับ:

  1. นักพัฒนามือใหม่ที่ไม่รู้จักSQLหรือรู้เรื่องไม่ดี นี่เป็นสูตรสำหรับภัยพิบัติ แต่พวกเขาสามารถหนีไปได้ถ้าโครงการนั้นสำคัญ

  2. วิศวกรที่มีประสบการณ์ที่รู้ว่าพวกเขาทำอะไรและต้องการที่จะสร้างสิ่งที่รวดเร็ว นี่อาจเป็นกลยุทธ์ที่ใช้การได้ (แต่อ่านเพิ่มเติม)

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

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

ฉันลงเอยในระดับที่ต่ำกว่าและเริ่มใช้งานJDBI- ห้องสมุดที่ดีที่มี "เวทมนต์" เพียงพอที่จะช่วยคุณประหยัดจากหม้อไอน้ำ ด้วยคุณสามารถควบคุมการสืบค้น SQL ได้อย่างสมบูรณ์และแทบไม่ต้องต่อสู้กับไลบรารีเลย


นี่เป็นคำตอบที่ดี แต่ถ้าคุณสามารถจดรายการมุมและรายละเอียดเพิ่มเติมมันจะมีประโยชน์มาก มันจะกลายเป็นคำตอบที่ยอดเยี่ยม ขอบคุณ
John

มันไม่ง่ายเลยที่จะจำสิ่งที่ฉันไม่ได้ทำงานกับ Spring Data มาระยะหนึ่งแล้ว - ฉันจะต้องใช้รหัสเก่าและจะเพิ่มความคิดเห็นเพิ่มเติม อย่างไรก็ตามสิ่งหนึ่งที่น่ารำคาญจาก JPA ของฉัน - บ่อยครั้งที่วัตถุต้องอ้างอิงซึ่งกันและกัน (เช่นสำหรับการดำเนินการเรียงซ้อน) สิ่งนี้ทำให้เกิดข้อผิดพลาด Stack Overflow (เนื่องจากการอ้างอิงแบบวงกลม) เมื่อ Spring พยายามทำให้เป็นอนุกรมพวกเขาบังคับให้คุณเข้าสู่การเล่นซอ / วิธีแก้ปัญหาที่น่าเกลียด ปัญหานี้เป็นเรื่องเกี่ยวกับ Spring Data เนื่องจากเป็นปัญหาของ JPA อย่างไรก็ตามเนื่องจาก JPA เป็นรากฐานของ Spring Data คุณจะได้รับ "ฟรี"
raiks

แก้ไขโพสต์และเพิ่มอีกหนึ่งตัวอย่าง
raiks

1

Hibernate เป็นการใช้งาน "JPA" ซึ่งเป็นข้อมูลจำเพาะสำหรับวัตถุ Java ในฐานข้อมูล

ฉันอยากจะแนะนำให้ใช้ wrt JPA เนื่องจากคุณสามารถสลับไปมาระหว่าง ORMS ที่แตกต่างกันได้

เมื่อคุณใช้ JDBC คุณต้องใช้ SQL Queries ดังนั้นหากคุณมีความเชี่ยวชาญใน SQL ให้เลือก JDBC


1

หากคุณต้องการความเรียบง่ายและควบคุมการสืบค้น SQL ได้มากขึ้นฉันขอแนะนำให้ใช้ Spring Data / Spring JDBC

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

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