اگر با ترکیب اسپرینگ بوت و JPA کار کرده باشی، احتمال زیاد این کد رو نوشتی:
public interface UserRepository extends JpaRepository<User, Long> {
// کدها
}
اما تا حالا برات سوال شده که واقعاً JpaRepository چیکار میکنه؟ و آیا متدهای CrudRepository رو هم شامل میشه؟
💡 جواب اینه: بله، شامل میشه! حالا ببینیم دقیقاً چه اتفاقی در پشت صحنه میافته:
زنجیرهی وراثت در JpaRepository:
JpaRepository
└── PagingAndSortingRepository
└── CrudRepository
وقتی JpaRepository رو گسترش میدی، در واقع این امکانات رو به صورت کامل به دست میاری:
عملکرد داخلی به چه شکله؟
اسپرینگ بوت، اینترفیسهایی که با @Repository علامتگذاری شدن رو اسکن میکنه.
برای هر کدوم از اونها یک پراکسی (proxy) با استفاده از SimpleJpaRepository میسازه.
این پراکسی درخواستها رو به EntityManager مربوط به JPA ارجاع میده.
ابزار JPA مثل Hibernate، درخواستها رو به SQL ترجمه میکنه.
در نهایت JDBC اون کوئری رو به پایگاه داده میفرسته.
و همه این مراحل بدون اینکه حتی یک کلاس پیادهسازی بنویسی انجام میشن!
پیدا کردن با شناسه: findById(Long id)
پیدا کردن همه رکوردها: findAll()
ذخیره یا بهروزرسانی موجودیت: save(entity)
حذف بر اساس شناسه: deleteById(id)
شمارش رکوردها: count()
دریافت صفحهبندیشده: findAll(Pageable pageable)
چرا این موضوع مهمه؟
وقتی از JpaRepository استفاده میکنی:
اسپرینگ دیتا JPA یکی از بهترین نمونههای «قانون بهجای پیکربندی» هست. هر چی بهتر بفهمیش، کنترل بیشتری بهت میده 💪
⚡️ @javapro_ir✈️ @group_javapro