JPA CRUD Tutorial | آموزش CRUD در JPA
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- JPA Java Persistence API
یک استاندارد یا Specification در جاوا است که برای مدیریت دادههای رابطهای در اپلیکیشنها استفاده میشود و عملیات دیتابیسی را سادهتر میکند.
- ORM Object-Relational Mapping
تکنیکی است که اشیا یا Objects در زبان برنامهنویسی را به جدولهای دیتابیس متناظر میکند تا برنامهنویس بدون درگیری مستقیم با SQL، با دیتابیس کار کند.
- Implementation پیادهسازی
از آنجا که JPA صرفاً یک استاندارد است، برای اجرا به یک کتابخانه پیادهساز نیاز دارد. Hibernate یکی از محبوبترین پیادهسازهای JPA است.
- Entity
کلاسی است که نمایانگر یک جدول در دیتابیس است. هر نمونه یا Instance از این کلاس، متناظر با یک سطر از آن جدول خواهد بود.
- EntityManager
رابط اصلی یا Interface برای تعامل با Persistence Context است که عملیاتهای CRUD را روی Entityها مدیریت میکند.
- Transaction
یک واحد کاری است که مجموعهای از عملیاتها را در بر میگیرد. برای تغییر در دیتابیس، مانند ایجاد، بهروزرسانی یا حذف، شروع یا Begin و ثبت یا Commit تراکنش الزامی است.
- Persistence Context
محیطی است که در آن نمونههای Entity توسط EntityManager مدیریت میشوند و تغییرات آنها ردیابی میشود.
- Lombok
کتابخانهای برای کاهش کدهای تکراری یا Boilerplate است. این کتابخانه با استفاده از انوتیشنهایی مانند @Data یا @NoArgsConstructor، متدها و سازندهها را بهصورت خودکار ایجاد میکند.
موارد مصاحبه ای
- تفاوت JPA و Hibernate در چیست؟
JPA یک واسط برنامهنویسی یا API و مجموعهای از استانداردها است. اما Hibernate یک فریمورک است که این استانداردها را پیادهسازی میکند و قابلیتهای اضافی نیز ارائه میدهد.
- چرا هر Entity حتماً به No-Args Constructor نیاز دارد؟
فریمورکهایی مانند Hibernate برای ساختن نمونه از کلاس Entity هنگام واکشی دادهها، از Reflection استفاده میکنند. وجود یک سازنده بدون آرگومان یا No-Args Constructor با سطح دسترسی public یا protected برای این کار الزامی است.
- تفاوت متد
persistوmergeچیست؟
متد persist برای ذخیره یک Entity جدید و وارد کردن آن به دیتابیس یا Insert استفاده میشود.
متد merge برای بهروزرسانی یا Update یک Entity که قبلاً از وضعیت مدیریت خارج شده است، به کار میرود.
- چرا برای عملیات Read مانند
findالزامی به تراکنش دستی نیست اما برای Create/Update/Delete هست؟
عملیات خواندن تغییری در وضعیت دیتابیس ایجاد نمیکند. اما برای حفظ یکپارچگی دادهها یا Data Integrity در عملیاتهای تغییردهنده، باید تراکنش مدیریت شود تا در صورت بروز خطا، تغییرات ذخیره نشوند.
- اگر متد
commitدر انتهای تراکنش صدا زده نشود چه اتفاقی میافتد؟
حتی اگر کدهای مربوط به persist یا merge اجرا شده باشند، هیچ تغییری در دیتابیس نهایی نمیشود. در این حالت، عملیات اصطلاحاً Rollback میشود یا اصلاً اعمال نمیگردد.
سناریو کاربردی
در این آموزش، مدیریت موجودیت دانشجو یا Student پیادهسازی شد. ابتدا یک کلاس با ویژگیهای id بهعنوان کلید اصلی، name و age تعریف شد.
۱. عملیات Create
ابتدا یک Object از دانشجو ساخته شد. سپس یک تراکنش آغاز شد و با متد persist، آبجکت در دیتابیس ذخیره شد. در نهایت تراکنش Commit شد.
۲. عملیات Read
با استفاده از متد find و پاس دادن کلاس Entity و مقدار کلید اصلی یا ID، اطلاعات دانشجو از دیتابیس واکشی شد.
۳. عملیات Update
ابتدا دانشجو با متد find پیدا شد. سپس مقدار ویژگی موردنظر، مثلاً سن، تغییر کرد و با متد merge در قالب یک تراکنش، تغییرات در دیتابیس ثبت شد.
۴. عملیات Delete
مشابه عملیات بهروزرسانی، ابتدا دانشجو پیدا شد و سپس با متد remove درون یک تراکنش، رکورد مربوطه حذف شد.
بیشتر بدانید
- نکته دیباگ
با فعال کردن خاصیت show_sql در تنظیمات Hibernate، میتوانید کوئریهای SQL تولیدشده توسط JPA را در کنسول مشاهده کنید. این کار برای درک بهتر عملکرد سیستم بسیار مفید است.
- نکته در مورد Lombok
هنگامی که یک سازنده دلخواه، مانند @AllArgsConstructor، اضافه میکنید، سازنده پیشفرض جاوا حذف میشود. بنابراین برای نیاز JPA حتماً باید از @NoArgsConstructor استفاده کنید.
