[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-v-chyom-raznitsa-mezhdu-repository-crudrepository-i-jparepository":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},632,"v-chyom-raznitsa-mezhdu-repository-crudrepository-i-jparepository",14,"spring","Spring","🌱","В чём разница между Repository, CrudRepository и JpaRepository?","Эти интерфейсы образуют иерархию наследования, каждый следующий добавляет функциональность.\n\n| Интерфейс | Что добавляет |\n|-----------|---------------|\n| Repository | Маркерный интерфейс (без методов) |\n| CrudRepository | Базовые CRUD: save, findById, findAll, count, delete |\n| ListCrudRepository (3.0+) | То же, но возвращает List вместо Iterable |\n| PagingAndSortingRepository | findAll(Sort), findAll(Pageable) |\n| JpaRepository | flush, saveAndFlush, deleteInBatch, getReferenceById |\n\n### Ключевые различия CrudRepository vs JpaRepository\n\n| Метод | CrudRepository | JpaRepository |\n|-------|---------------|---------------|\n| `findAll()` | `Iterable\u003CT>` | `List\u003CT>` |\n| `flush()` | Нет | Есть |\n| `saveAndFlush()` | Нет | Есть |\n| `deleteInBatch()` | Нет | Есть (эффективнее) |\n| `getReferenceById()` | Нет | Есть (lazy proxy) |\n\n### Когда что использовать\n\n```java\n\u002F\u002F Для большинства случаев -- JpaRepository\npublic interface UserRepository extends JpaRepository\u003CUser, Long> { }\n\n\u002F\u002F Если нужен минимум -- CrudRepository\npublic interface AuditLogRepository extends CrudRepository\u003CAuditLog, Long> { }\n\n\u002F\u002F Если нужно ограничить набор методов\n@NoRepositoryBean\npublic interface ReadOnlyRepository\u003CT, ID> extends Repository\u003CT, ID> {\n    Optional\u003CT> findById(ID id);\n    List\u003CT> findAll();\n}\n```\n\n> **На собеседовании:** покажите знание иерархии и когда использовать какой интерфейс. Частая ошибка -- использовать `getReferenceById()` вместо `findById()` (getReferenceById возвращает прокси, и при обращении к полям вне транзакции будет `LazyInitializationException`).","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"В чём разница между Repository, CrudRepository и JpaReposito — Gymterview","Эти интерфейсы образуют иерархию наследования, каждый следующий добавляет функциональность.",[7,13],true]