JPA vs Hibernate
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- JPA Java Persistence API
یک Java Specification یا مشخصه فنی است که استانداردهایی را برای مدیریت دادههای رابطهای در برنامههای جاوا تعریف میکند. JPA بهخودیخود کد اجرایی نیست، بلکه مجموعهای از قوانین است که کار با دیتابیس را سادهتر میکند.
- Hibernate
یک فریمورک ORM متنباز و محبوب است که بهعنوان یک پیادهسازی یا Implementation از استانداردهای JPA عمل میکند. Hibernate کد واقعی است و وظیفه برقراری ارتباط با دیتابیس را بر عهده دارد.
- ORM Object-Relational Mapping
تکنولوژی یا مفهومی است که مانند یک پل عمل میکند تا کلاسهای جاوا یا Objects را به جدولهای دیتابیس یا Relational Tables و برعکس، متصل و نگاشت کند.
- Entity
کلاسهای مدل در برنامه یا Domain Models هستند که قرار است متناظر با آنها یک جدول در دیتابیس ساخته شود. این کلاسها دادههای برنامه را حمل میکنند.
- Specification
به معنای تعیین خصوصیات و استانداردها روی کاغذ است. Specification مشخص میکند که یک ابزار ORM چه کارهایی باید انجام دهد و چه استانداردهایی را رعایت کند.
- Implementation
پیادهسازی واقعی و کدهای اجرایی است که طبق استانداردهای Specification نوشته شدهاند تا عملیاتهای موردنظر، مانند ذخیره در دیتابیس، را انجام دهند.
- JPQL Java Persistence Query Language
زبان کوئرینویسی مخصوص JPA است که بهجای تمرکز بر جدولهای دیتابیس، بر اساس آبجکتها و کلاسهای جاوا نوشته میشود.
- HQL Hibernate Query Language
نسخه اختصاصی زبان کوئرینویسی در Hibernate است که شباهت زیادی به SQL دارد، اما بهصورت شیءگرا یا Object-Oriented عمل میکند.
- Boilerplate Code
بخشهایی از کد هستند که در پروژههای مختلف تکرار میشوند و ارزش تجاری خاصی ندارند؛ مانند کدهای باز و بسته کردن کانکشن دیتابیس در JDBC. ابزارهایی مانند Hibernate این کدهای تکراری را حذف میکنند.
موارد مصاحبه ای
- تفاوت اصلی بین JPA و Hibernate چیست؟
JPA یک Specification یا راهنما و مجموعهای از Guidelines است که استانداردها را تعریف میکند. اما Hibernate پیادهسازی واقعی یا Implementation آن استانداردها است.
شما نمیتوانید JPA را بهتنهایی اجرا کنید. برای کارکرد برنامه، حتماً به یک پیادهسازی مانند Hibernate نیاز دارید.
- چرا استفاده از Hibernate باعث افزایش Portability قابلیت جابهجایی دیتابیس میشود؟
در روشهای قدیمی مانند JDBC، کوئریهای SQL وابسته به نوع دیتابیس، مانند PostgreSQL یا MySQL، بودند. Hibernate با مدیریت کوئریها اجازه میدهد بدون تغییر در کدهای اصلی برنامه، دیتابیس پروژه را تغییر دهید.
- چالشهای اصلی استفاده مستقیم از JDBC چیست؟
استفاده مستقیم از JDBC باعث نیاز به مدیریت دستی Exceptionها، نوشتن حجم زیادی از Boilerplate Code، دشواری در مدیریت روابط یا Relations بین جدولها و افزایش پیچیدگی کدها در پروژههای بزرگ میشود.
- نقش Entity Manager در JPA چیست؟
EntityManager یک API استاندارد است که برای مدیریت چرخه حیات انتیتیها و انجام عملیاتهای CRUD، یعنی ایجاد، خواندن، بهروزرسانی و حذف، استفاده میشود.
- آیا میتوان بدون استفاده از Hibernate از JPA استفاده کرد؟
بله. JPA یک استاندارد است و میتوان از پیادهسازیهای دیگری مانند EclipseLink یا OpenJPA نیز استفاده کرد. با این حال، Hibernate محبوبترین پیادهسازی موجود است.
سناریو کاربردی
در این آموزش، نحوه نگاشت یک کلاس جاوا به دیتابیس با مثال کلاس Student توضیح داده شد.
فرض کنید کلاسی به نام Student در جاوا دارید که دارای فیلد id از نوع int و فیلد firstName از نوع String است. بدون نیاز به نوشتن کوئریهای پیچیده SQL، Hibernate این کلاس را به جدولی به نام Student در دیتابیس متصل میکند.
در این فرآیند:
۱. نوع داده String در جاوا بهصورت خودکار به VARCHAR در دیتابیس تبدیل میشود.
۲. فیلد id به ستون کلید اصلی یا Primary Key متناظر میشود.
۳. بهجای نوشتن دستی INSERT INTO برای ذخیره دانشجو، از متدهای آمادهای مانند persist یا save استفاده میشود. این کار باعث تمیزتر شدن کد و کاهش خطا میشود.
بیشتر بدانید
- ترتیب ظهور تکنولوژیها
جالب است بدانید که Hibernate پیش از JPA وجود داشته است. در واقع، Hibernate آنقدر موفق بود که استانداردهای JPA با الهام گرفتن از آن شکل گرفتند تا یک استاندارد واحد برای همه کتابخانههای ORM در جاوا ایجاد شود.
- نکته دیباگ و اجرا
اگر در پروژه خود از انوتیشنهای JPA مانند @Entity استفاده کنید، اما کتابخانه Hibernate Core را به وابستگیهای پروژه یا Dependencies اضافه نکنید، برنامه هنگام اجرا با خطا مواجه میشود؛ زیرا JPA فقط نقشه است و برای اجرا به موتور Hibernate نیاز دارد.
- مدیریت روابط
با استفاده از انوتیشنهای ساده در Hibernate، میتوان روابط پیچیده دیتابیسی مانند One-to-Many یا Many-to-Many را بهسادگی و بدون درگیر شدن با کدهای پیچیده SQL مدیریت کرد.
