در ادامه بحث (Hibernate-Jpa) بخش نهم و ادامه نمونه پروژه مربوطه داریم :

Annotation های مخصوص بکار رفته در پروژه بخش قبل عبارتند از :

Entity@: قبل از تعریف این سه کلاس بکار رفته که نشان دهنده موجودیت بودن هر کدام است و حتما باید ذکر شود.

Table@: در صورتی کاربرد دارد که بخواهیم بجای ایجاد جدول با نام پیشفرض در دیتابیس, نامی دلخواه قرار دهیم.

Id@: جهت تنظیم فیلد آیدی و کلید اصلی کردن آن بکار می رود.

GeneratedValue@: برای تعیین نوع فیلد کلید اصلی می باشد.همچنین شامل خواص مختلفی است که در اینجا Auto تنظیم شده به این معنا که با توجه به نوع دیتابیس بصورت اتوماتیک مقادیر تولید شده در این فیلد را تنظیم می کند.در صورت عدم تعیین استراتژی این Annotation , بطور پیشفرض با Auto مقدار دهی می شود.

Column@: در صورتی که بخواهیم هر فیلد در جدول با نام دلخواه ایجاد شود این Annotation را بالای آن قرار داده و نام مدنظر را به آن می دهیم.

ElementCollection@:گاهی اوقات برای ایجاد ارتباط با Entity دیگر, آبجکتی از آن را بصورت لیست ایجاد می کنیم که ممکن است در خروجی خطا دهد و لیست را قبول نکند که با این Annotation احتمالا مشکل رفع می شود اما اکثرا ممکن است خطا مربوط به عدم درست بودن منطق رابطه ما باشد که در این صورت فقط بایدآنرا تغییر دهیم.

OneToOne@: در صورتی که دو موجودیت دارای ارتباط یک به یک باشند برای مثال هر استاد یک درس و هر درس یک استاد داشته باشد, در این صورت ابتدا باید آبجکتی از جنس درس در کلاس استاد و همچنین آبجکتی از جنس استاد در کلاس درس ایجاد شود. این Annotation باید بالای آبجکتهای ساخته شده در هر دو کلاس ذکر شود که نشان دهنده وجود ارتباط یک به یک بین دو Entity است. خاصیت CascadeType این Annotation در کلاس استاد را All قرار می دهیم که در این صورت هر عملی که روی استاد انجام شود(مانندPERSIST, REMOVE, REFRESH, MERGE, DETACH) بر روی درس هم اعمال می شود. البته توصیه می شود احتیاطا از یکی از اعمال مذکور استفاده شود تا استفاده از خاصیت All . همچنین بالای آبجکت مربوط به استاد در کلاس درس, خاصیت mapped by را با نام آبجکت استاد قرار می دهیم.

OneToMany@ و ManyToOne@ : در صورتی که دو موجودیت دارای ارتباط یک به چند و چند به یک باشند برای مثال هر استاد چند دانشجو دارد و دانشجویان یک استاد دارند.ابتدا در کلاس استاد آبجکتی از کلاس دانشجو ساخته و OneToMany@ را همراه mapped by که با نام آبجکت استاد در کلاس دانشجو مقداردهی شده را بالای آبجکت دانشجو می گذاریم و همچنین این مرحله را در کلاس دانشجو با این تفاوت که بالای آبجکت استاد ManyToOne@ با خاصیت CascadeType که با All تنظیم شده انجام می گیرد.

ManyToMany@: در صورتی که دو موجودیت دارای ارتباط چند به چند باشند برای نمونه دانشجویان چند درس دارند و درس ها برای دانشجویان هستند. ابتدا طبق موارد قبل آبجکت هایی در دو کلاس Entity مربوطه ایجاد می شود سپس ManyToMany@ بالای آنها قرار می گیرد که مقابل آن در بالای آبجکت دانشجو در کلاس درس, mapped by که با نام آبجکت استاد در کلاس دانشجو مقداردهی شده را می گذاریم و مقابل ManyToMany@ بالای آبجکت درس کلاس دانشجو خاصیت CascadeType با All تنظیم می شود.

 

سپس در ادامه پس از Annotation گذاری, به کلاس entmng باز می گردیم و با ()getTransaction().begin تراکنش را آغاز می کنیم و بعد از ایجاد آبجکتها و set کردن مقادیر در انتهای هر کدام متد persist را جهت ذخیره سازی دردیتابیس بکار می بریم. در مرحله پایانی پس از ایجاد رکورد ها و persist آنها, متد commit را برای اعمال همه تغییرات در دیتابیس و سپس بستن آن فراخوانی می کنیم. در آخر آبجکت های EntityManagerFactory و EntityManager را با متد close ببندیم.