อะไรคือความแตกต่างที่สำคัญระหว่าง Hibernate และ Spring Data JPA เมื่อใดที่เราไม่ควรใช้ Hibernate หรือ Spring Data JPA นอกจากนี้เมื่อใดที่เท็มเพลต Spring JDBC อาจทำงานได้ดีกว่า Hibernate / Spring Data JPA
อะไรคือความแตกต่างที่สำคัญระหว่าง Hibernate และ Spring Data JPA เมื่อใดที่เราไม่ควรใช้ Hibernate หรือ Spring Data JPA นอกจากนี้เมื่อใดที่เท็มเพลต Spring JDBC อาจทำงานได้ดีกว่า Hibernate / Spring Data JPA
คำตอบ:
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
ดังนั้นข้อมูลไฮเบอร์เนตและสปริงจึงเป็นส่วนเสริมมากกว่าคู่แข่ง
มี 3 สิ่งต่าง ๆ ที่เราใช้อยู่ที่นี่:
ดังนั้นให้เข้าใจว่าข้อมูลฤดูใบไม้ผลิ jpa และฤดูใบไม้ผลิ + จำศีลทำงาน -
สมมติว่าคุณกำลังใช้สปริง + ไฮเบอร์เนตสำหรับใบสมัครของคุณ ตอนนี้คุณต้องมีอินเทอร์เฟซ dao และการใช้งานที่คุณจะเขียนการดำเนินการ crud โดยใช้ SessionFactory of hibernate สมมติว่าคุณกำลังเขียนคลาส dao สำหรับคลาสพนักงานพรุ่งนี้ในแอปพลิเคชันของคุณคุณอาจต้องเขียนการดำเนินการที่ไม่ซับซ้อนสำหรับหน่วยงานอื่น ๆ ดังนั้นจึงมีรหัสสำเร็จรูปมากมายที่เราสามารถดูได้ที่นี่
ขณะนี้ข้อมูล Spring jpa อนุญาตให้เรากำหนดอินเตอร์เฟส dao โดยขยายที่เก็บ (crudrepository, jparepository) เพื่อให้สามารถใช้งาน dao ได้ที่รันไทม์ คุณไม่จำเป็นต้องเขียนการติดตั้ง dao อีกต่อไปนั่นคือวิธีที่ข้อมูล jpa ทำให้ชีวิตของคุณง่ายขึ้น
ฉันไม่เห็นด้วยกับ SpringJPA ที่ทำให้การแสดงสดง่าย ใช่มันมีบางคลาสและคุณสามารถสร้าง DAO แบบง่าย ๆ ได้ แต่อันที่จริงมันคือทั้งหมดที่คุณสามารถทำได้ หากคุณต้องการทำอะไรมากกว่า findById () หรือบันทึกคุณต้องผ่านนรก:
เหตุใดการจัดการธุรกรรมของตัวเองจึงเป็นข้อเสีย เนื่องจาก 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 และฉันเชื่อว่ามันจะช่วยคุณได้มากในงานของคุณ :)
Spring Data
เป็นห้องสมุดความสะดวกสบายJPA
ที่อยู่เหนือสิ่งที่เป็นนามธรรมและนำความมหัศจรรย์ของฤดูใบไม้ผลิ (เช่นนั้นหรือไม่) ไปใช้กับร้านค้าที่ติดตา ส่วนใหญ่จะใช้สำหรับการทำงานกับฐานข้อมูลเชิงสัมพันธ์ ในระยะสั้นจะช่วยให้คุณประกาศอินเทอร์เฟซที่มีวิธีการเช่นfindByNameOrderByAge(String name);
นั้นจะถูกแยกวิเคราะห์ใน runtime และแปลงเป็นJPA
แบบสอบถามที่เหมาะสม
การวางตำแหน่งบนยอดของJPA
การใช้งานที่ดึงดูดสำหรับ:
นักพัฒนามือใหม่ที่ไม่รู้จักSQL
หรือรู้เรื่องไม่ดี นี่เป็นสูตรสำหรับภัยพิบัติ แต่พวกเขาสามารถหนีไปได้ถ้าโครงการนั้นสำคัญ
วิศวกรที่มีประสบการณ์ที่รู้ว่าพวกเขาทำอะไรและต้องการที่จะสร้างสิ่งที่รวดเร็ว นี่อาจเป็นกลยุทธ์ที่ใช้การได้ (แต่อ่านเพิ่มเติม)
จากประสบการณ์ของฉันด้วย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 ได้อย่างสมบูรณ์และแทบไม่ต้องต่อสู้กับไลบรารีเลย
Hibernate เป็นการใช้งาน "JPA" ซึ่งเป็นข้อมูลจำเพาะสำหรับวัตถุ Java ในฐานข้อมูล
ฉันอยากจะแนะนำให้ใช้ wrt JPA เนื่องจากคุณสามารถสลับไปมาระหว่าง ORMS ที่แตกต่างกันได้
เมื่อคุณใช้ JDBC คุณต้องใช้ SQL Queries ดังนั้นหากคุณมีความเชี่ยวชาญใน SQL ให้เลือก JDBC
หากคุณต้องการความเรียบง่ายและควบคุมการสืบค้น SQL ได้มากขึ้นฉันขอแนะนำให้ใช้ Spring Data / Spring JDBC
จำนวนของเส้นโค้งการเรียนรู้ที่ดีใน JPA และบางครั้งก็ยากที่จะแก้ไขปัญหา ในขณะที่คุณมีการควบคุม SQL อย่างเต็มที่จะกลายเป็นเรื่องง่ายขึ้นในการเพิ่มประสิทธิภาพการสืบค้นและปรับปรุงประสิทธิภาพ คุณสามารถแชร์ SQL ของคุณกับ DBA หรือคนที่มีความเข้าใจฐานข้อมูลได้ง่ายขึ้น