ความแตกต่างระหว่างคืออะไรCrudRepositoryและJpaRepositoryอินเตอร์เฟซในฤดูใบไม้ผลิข้อมูล JPA ?
เมื่อฉันเห็นตัวอย่างบนเว็บฉันเห็นพวกมันอยู่ที่นั่นใช้แทนกันได้
ความแตกต่างระหว่างพวกเขาคืออะไร?
ทำไมคุณต้องการใช้อีกอันหนึ่ง?
ความแตกต่างระหว่างคืออะไรCrudRepositoryและJpaRepositoryอินเตอร์เฟซในฤดูใบไม้ผลิข้อมูล JPA ?
เมื่อฉันเห็นตัวอย่างบนเว็บฉันเห็นพวกมันอยู่ที่นั่นใช้แทนกันได้
ความแตกต่างระหว่างพวกเขาคืออะไร?
ทำไมคุณต้องการใช้อีกอันหนึ่ง?
คำตอบ:
JpaRepository
ขยายซึ่งจะขยายPagingAndSortingRepository
CrudRepository
หน้าที่หลักของพวกเขาคือ:
CrudRepository
ส่วนใหญ่ให้ฟังก์ชั่น CRUDPagingAndSortingRepository
จัดเตรียมวิธีการทำเลขหน้าและเรียงลำดับระเบียนJpaRepository
จัดเตรียมวิธีที่เกี่ยวข้องกับ JPA บางอย่างเช่นการล้างบริบทการคงอยู่และการลบระเบียนในชุดงานเพราะมรดกดังกล่าวข้างต้น JpaRepository
จะมีฟังก์ชั่นทั้งหมดของและCrudRepository
PagingAndSortingRepository
ดังนั้นถ้าคุณไม่จำเป็นต้องเก็บข้อมูลที่มีฟังก์ชั่นที่มีให้โดยJpaRepository
และการใช้งานPagingAndSortingRepository
CrudRepository
คำตอบของ Ken นั้นถูกต้องแล้ว แต่ฉันอยากจะพูดถึงเรื่อง "ทำไมคุณถึงอยากใช้อีกอันหนึ่งล่ะ?" ส่วนหนึ่งของคำถามของคุณ
อินเทอร์เฟซพื้นฐานที่คุณเลือกสำหรับพื้นที่เก็บข้อมูลของคุณมีวัตถุประสงค์หลักสองประการ ขั้นแรกให้คุณอนุญาตโครงสร้างพื้นฐานที่เก็บ Spring Data เพื่อค้นหาอินเทอร์เฟซของคุณและทริกเกอร์การสร้างพร็อกซี วัตถุประสงค์ที่สองคือการดึงฟังก์ชั่นให้มากที่สุดเท่าที่จำเป็นในอินเตอร์เฟสโดยไม่ต้องประกาศวิธีการพิเศษ
คลังข้อมูลหลักของ Spring Data มาพร้อมกับอินเตอร์เฟสพื้นฐานสองชุดที่เปิดเผยชุดฟังก์ชันเฉพาะ:
CrudRepository
- วิธีการ CRUDPagingAndSortingRepository
- วิธีการให้เลขหน้าและการเรียงลำดับ (ขยายCrudRepository
)โมดูลร้านค้าแต่ละรายการ (เช่นสำหรับ JPA หรือ MongoDB) เปิดเผยส่วนขยายเฉพาะร้านค้าของอินเทอร์เฟซฐานเหล่านี้เพื่อให้สามารถเข้าถึงฟังก์ชันการทำงานเฉพาะร้านค้าเช่นการล้างหรือการแบทช์เฉพาะที่คำนึงถึงร้านค้าเฉพาะ ตัวอย่างนี้คือdeleteInBatch(…)
ของJpaRepository
ที่แตกต่างจากdelete(…)
ที่จะใช้แบบสอบถามเพื่อลบหน่วยงานที่ได้รับซึ่งเป็น performant มากขึ้น แต่มาพร้อมกับผลข้างเคียงของการไม่เรียกน้ำตก JPA กำหนด (ขณะที่กำหนดสเปคมันบริการ)
โดยทั่วไปเราแนะนำไม่ให้ใช้ส่วนต่อประสานพื้นฐานเหล่านี้เนื่องจากพวกเขาเปิดเผยเทคโนโลยีการคงอยู่พื้นฐานให้กับลูกค้าและทำให้การเชื่อมต่อระหว่างพวกเขาและพื้นที่เก็บข้อมูลแน่นขึ้น นอกจากนี้คุณยังได้รับเพียงเล็กน้อยจากคำจำกัดความดั้งเดิมของที่เก็บซึ่งโดยพื้นฐานแล้วคือ "กลุ่มของเอนทิตี" PagingAndSortingRepository
ดังนั้นถ้าคุณสามารถพักอยู่กับ
ข้อเสียของโดยตรงขึ้นอยู่กับหนึ่งในอินเตอร์เฟซฐานให้เป็นสองเท่า ทั้งสองคนอาจถูกมองว่าเป็นทฤษฎี แต่ฉันคิดว่ามันสำคัญที่ต้องระวัง:
Page
หรือPageable
ในรหัสของคุณ Spring Data ไม่แตกต่างจากไลบรารีวัตถุประสงค์ทั่วไปอื่น ๆ เช่น commons-lang หรือ Guava ตราบใดที่มันให้ผลประโยชน์ที่สมเหตุสมผล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
แต่ไม่เปิดเผยวิธีการจัดการ อ่านเพิ่มเติมเกี่ยวกับวิธีการที่ในเอกสารอ้างอิง
พื้นที่เก็บข้อมูลที่เป็นนามธรรมช่วยให้คุณสามารถเลือกพื้นที่เก็บข้อมูลพื้นฐานที่ขับเคลื่อนโดยความต้องการด้านสถาปัตยกรรมและการทำงานของคุณ ใช้สิ่งที่มีให้ในกล่องหากพวกเขาเหมาะสมสร้างอินเทอร์เฟซฐานพื้นที่เก็บข้อมูลของคุณเองหากจำเป็น อยู่ห่างจากส่วนต่อประสานที่เก็บข้อมูลของร้านค้าโดยเฉพาะ
สรุป:
PagingAndSortingRepository ขยาย CrudRepository
JpaRepository ขยาย PagingAndSortingRepository
CrudRepositoryอินเตอร์เฟซที่มีวิธีการสำหรับการดำเนินงาน CRUD ดังนั้นจึงช่วยให้คุณสร้าง, อ่าน, ปรับปรุงและลบบันทึกได้โดยไม่ต้องกำหนดวิธีของคุณเอง
PagingAndSortingRepositoryมีวิธีการเพิ่มเติมในการเรียกหน่วยงานที่ใช้เลขหน้าและการเรียงลำดับ
ในที่สุดJpaRepository จะเพิ่มฟังก์ชั่นเพิ่มเติมที่เฉพาะเจาะจงกับ JPA
คำตอบทั้งหมดให้รายละเอียดเพียงพอกับคำถาม อย่างไรก็ตามขอฉันเพิ่มบางอย่างเพิ่มเติม
เหตุใดเราจึงใช้อินเทอร์เฟซเหล่านี้:
อินเตอร์เฟสใดทำหน้าที่อะไร:
ใช้อินเทอร์เฟซไหน:
ตามhttp://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
โดยทั่วไปแล้วความคิดที่ดีที่สุดคือการใช้CrudRepositoryหรือPagingAndSortingRepositoryขึ้นอยู่กับว่าคุณต้องการเรียงลำดับและเพจจิ้งหรือไม่
JpaRepositoryควรหลีกเลี่ยงถ้าเป็นไปได้เพราะความสัมพันธ์ที่คุณเก็บเทคโนโลยีติดตา JPA และในกรณีส่วนใหญ่ที่คุณอาจจะไม่ได้ใช้วิธีการพิเศษที่ได้รับจากมัน