ความแตกต่างระหว่างอินเตอร์เฟส CrudRepository และ JpaRepository ใน Spring Data JPA คืออะไร


706

ความแตกต่างระหว่างคืออะไรCrudRepositoryและJpaRepositoryอินเตอร์เฟซในฤดูใบไม้ผลิข้อมูล JPA ?

เมื่อฉันเห็นตัวอย่างบนเว็บฉันเห็นพวกมันอยู่ที่นั่นใช้แทนกันได้

ความแตกต่างระหว่างพวกเขาคืออะไร?

ทำไมคุณต้องการใช้อีกอันหนึ่ง?


คำตอบ:


958

JpaRepositoryขยายซึ่งจะขยายPagingAndSortingRepositoryCrudRepository

หน้าที่หลักของพวกเขาคือ:

  • CrudRepository ส่วนใหญ่ให้ฟังก์ชั่น CRUD
  • PagingAndSortingRepository จัดเตรียมวิธีการทำเลขหน้าและเรียงลำดับระเบียน
  • JpaRepository จัดเตรียมวิธีที่เกี่ยวข้องกับ JPA บางอย่างเช่นการล้างบริบทการคงอยู่และการลบระเบียนในชุดงาน

เพราะมรดกดังกล่าวข้างต้น JpaRepositoryจะมีฟังก์ชั่นทั้งหมดของและCrudRepository PagingAndSortingRepositoryดังนั้นถ้าคุณไม่จำเป็นต้องเก็บข้อมูลที่มีฟังก์ชั่นที่มีให้โดยJpaRepositoryและการใช้งานPagingAndSortingRepositoryCrudRepository


144
และส่งคืนรายการ <> แทน Iterable <> ใน findAll () :-)
Hinotori

397

คำตอบของ Ken นั้นถูกต้องแล้ว แต่ฉันอยากจะพูดถึงเรื่อง "ทำไมคุณถึงอยากใช้อีกอันหนึ่งล่ะ?" ส่วนหนึ่งของคำถามของคุณ

ข้อมูลพื้นฐานเกี่ยวกับ

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

อินเตอร์เฟสทั่วไป

คลังข้อมูลหลักของ Spring Data มาพร้อมกับอินเตอร์เฟสพื้นฐานสองชุดที่เปิดเผยชุดฟังก์ชันเฉพาะ:

  • CrudRepository - วิธีการ CRUD
  • PagingAndSortingRepository- วิธีการให้เลขหน้าและการเรียงลำดับ (ขยายCrudRepository)

อินเตอร์เฟสเฉพาะร้านค้า

โมดูลร้านค้าแต่ละรายการ (เช่นสำหรับ JPA หรือ MongoDB) เปิดเผยส่วนขยายเฉพาะร้านค้าของอินเทอร์เฟซฐานเหล่านี้เพื่อให้สามารถเข้าถึงฟังก์ชันการทำงานเฉพาะร้านค้าเช่นการล้างหรือการแบทช์เฉพาะที่คำนึงถึงร้านค้าเฉพาะ ตัวอย่างนี้คือdeleteInBatch(…)ของJpaRepositoryที่แตกต่างจากdelete(…)ที่จะใช้แบบสอบถามเพื่อลบหน่วยงานที่ได้รับซึ่งเป็น performant มากขึ้น แต่มาพร้อมกับผลข้างเคียงของการไม่เรียกน้ำตก JPA กำหนด (ขณะที่กำหนดสเปคมันบริการ)

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

อินเตอร์เฟสฐานที่เก็บแบบกำหนดเอง

ข้อเสียของโดยตรงขึ้นอยู่กับหนึ่งในอินเตอร์เฟซฐานให้เป็นสองเท่า ทั้งสองคนอาจถูกมองว่าเป็นทฤษฎี แต่ฉันคิดว่ามันสำคัญที่ต้องระวัง:

  1. ทั้งนี้ขึ้นอยู่กับอินเตอร์เฟซที่เก็บข้อมูลฤดูใบไม้ผลิคู่อินเตอร์เฟซที่เก็บของคุณไปยังห้องสมุด ฉันไม่คิดว่านี่เป็นปัญหาเฉพาะเนื่องจากคุณอาจใช้ abstractions เช่นPageหรือPageableในรหัสของคุณ Spring Data ไม่แตกต่างจากไลบรารีวัตถุประสงค์ทั่วไปอื่น ๆ เช่น commons-lang หรือ Guava ตราบใดที่มันให้ผลประโยชน์ที่สมเหตุสมผล
  2. ด้วยการขยายเช่นCrudRepositoryคุณแสดงวิธีการคงอยู่อย่างสมบูรณ์ในครั้งเดียว นี้น่าจะเป็นที่ดีที่สุดในสถานการณ์เช่นกัน แต่คุณอาจจะเป็นสถานการณ์ที่คุณต้องการที่จะได้รับการควบคุมที่ละเอียดมากขึ้นกว่าวิธีการเปิดเผยเช่นการสร้างReadOnlyRepositoryที่ไม่ได้รวมsave(…)และวิธีการของdelete(…)CrudRepository

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

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }

interface ReadOnlyRepository<T> extends Repository<T, Long> {

  // Al finder methods go here
}

อินเทอร์เฟซที่เก็บข้อมูลแรกคืออินเทอร์เฟซฐานวัตถุประสงค์ทั่วไปที่แก้ไขจุด 1 เท่านั้น แต่ยังผูกประเภท ID ให้Longสอดคล้องกัน อินเทอร์เฟซที่สองมักจะมีfind…(…)วิธีการคัดลอกทั้งหมดจากCrudRepositoryและPagingAndSortingRepositoryแต่ไม่เปิดเผยวิธีการจัดการ อ่านเพิ่มเติมเกี่ยวกับวิธีการที่ในเอกสารอ้างอิง

ข้อมูลอย่างย่อ - tl; dr

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


84

ป้อนคำอธิบายรูปภาพที่นี่

สรุป:

  • PagingAndSortingRepository ขยาย CrudRepository

  • JpaRepository ขยาย PagingAndSortingRepository

CrudRepositoryอินเตอร์เฟซที่มีวิธีการสำหรับการดำเนินงาน CRUD ดังนั้นจึงช่วยให้คุณสร้าง, อ่าน, ปรับปรุงและลบบันทึกได้โดยไม่ต้องกำหนดวิธีของคุณเอง

PagingAndSortingRepositoryมีวิธีการเพิ่มเติมในการเรียกหน่วยงานที่ใช้เลขหน้าและการเรียงลำดับ

ในที่สุดJpaRepository จะเพิ่มฟังก์ชั่นเพิ่มเติมที่เฉพาะเจาะจงกับ JPA


สิ่งที่เกี่ยวกับ "ขยายพื้นที่เก็บข้อมูล <>"? มันจะมีวิธีใดบ้าง? เหมือนกับ CrudRepository หรือไม่
s-kaczmarek


3

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

เหตุใดเราจึงใช้อินเทอร์เฟซเหล่านี้:

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

อินเตอร์เฟสใดทำหน้าที่อะไร:

  • CrudRepository : จัดให้มีฟังก์ชั่น CRUD
  • PagingAndSortingRepository : จัดเตรียมวิธีการทำเลขหน้าและเรียงลำดับระเบียน
  • JpaRepository : จัดเตรียมวิธีการที่เกี่ยวข้องกับ JPA เช่นการล้างบริบทการคงอยู่และลบระเบียนในชุดงาน

ใช้อินเทอร์เฟซไหน:

ตามhttp://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/

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

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

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