+3 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

چرا در Hibernate پیشنهاد می شود که کلاس های Entity حتما متدهای equals و hashCode را پیاده سازی کنند؟ اگر این متدها توسط کلاس Entity بازنویسی (override) نشوند چه اتفاقی ممکن است بیوفتد؟

1 پاسخ

+5 امتیاز
قبل توسط (1.4هزار امتیاز)
ویرایش شده قبل توسط
 
بهترین پاسخ

شناسایی یک شی در virtual machine و پایگاه داده با هم متفاوت است:

  • در VM: برای شی IDای نگه داشته نمی شود بلکه Reference ای به مکانی از حافظه که شی در آن قرار دارد نگه داشته می شود.
  • در DB: هر شی (موجودیت) در هر جدولی با ID به طور یکتا شناسایی می شود (که همان Primery Key است).

فرض کنید که یک شی از نوع Person و با نام p1 ساخته اید و آن را در DB ذخیره (persist) کرده اید؛ در جای دیگر از کُد خود، همین موجودیت ذخیره شده را از  DB خوانده اید و در یک شی دیگر از نوع Person و نام p2 ریخته اید. الان شما دو شی p1 و p2 دارید که از نظر VM یکسان نیستند، ولی به یک موجودیت (سطر) در DB نگاشت شده اند.

پس مهم است که equals و hashcode را بازنویسی (override) کنیم. با بازنویسی کردنِ متد equals می توانیم شرایطی را تعیین کنیم که دو شی با هم یکسان هستند یا خیر، بدون این که Reference آنها را درنظر بگیریم. (یادآوری: هر وقت equals بازنویسی شود، hashcode نیز باید بشود؛ اشیای equals باید hashcode شان نیز برابر باشد) دقت شود که  equals در حالت پیش فرض، Reference های اشیا را با هم مقایسه می کند (برای همین است که باید بازنویسی شود).

برای اشیایی که persist می شوند: مهم است که تمام اشیای نمایانگرِ یک موجودیت (سطر) در DB، یکسان (equals) باشند؛ مخصوصا زمانی که با collection ها (مانند Set و List) سروکار داریم.

سوالات مشابه

+1 امتیاز
1 پاسخ 1.2هزار بازدید
+1 امتیاز
1 پاسخ 4.3هزار بازدید
0 امتیاز
0 پاسخ 258 بازدید
+1 امتیاز
3 پاسخ 1.6هزار بازدید
0 امتیاز
1 پاسخ 505 بازدید
0 امتیاز
1 پاسخ 319 بازدید
+1 امتیاز
0 پاسخ 404 بازدید
0 امتیاز
1 پاسخ 466 بازدید
0 امتیاز
1 پاسخ 2.1هزار بازدید
...