Entity Relationship in Java | روابط موجودیتها در جاوا
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
-
Entity Relationship مدیریت و پیادهسازی روابط بین جداول دیتابیس در محیط شیگرا با استفاده از استانداردهای JPA.
-
One-to-One (
@OneToOne) رابطهای که در آن هر نمونه از یکEntityدقیقاً با یک نمونه ازEntityدیگر در ارتباط است؛ مانند رابطه بین یک فرد و آدرس منحصربهفرد او. -
One-to-Many (
@OneToMany) رابطهای که در آن یک موجودیت میتواند با چندین نمونه از موجودیت دیگر در ارتباط باشد؛ مانند یک دانشجو که چندین آدرس مختلف دارد. -
Many-to-One (
@ManyToOne) عکس رابطه یکبهچند که در آن چندین نمونه از یک موجودیت به یک نمونه واحد از موجودیت دیگر اشاره میکنند. معمولاً این سمت، مالک رابطه (Owner) در دیتابیس شناخته میشود وForeign Keyدر جدول مربوط به آن قرار میگیرد. -
Many-to-Many (
@ManyToMany) رابطهای که در آن چندین نمونه از یک موجودیت با چندین نمونه از موجودیت دیگر در ارتباط هستند؛ مانند رابطه بین دانشجویان و درسها (هر دانشجو چند درس دارد و هر درس چندین دانشجو). -
Unidirectional رابطه یکطرفه که در آن فقط یکی از کلاسها از وجود کلاس دیگر و رابطه بینشان اطلاع دارد و فیلد مربوطه را در خود نگه میدارد.
-
Bidirectional رابطه دوطرفه که در آن هر دو کلاس به یکدیگر ارجاع دارند و میتوان از هر دو سمت به دادههای طرف مقابل دسترسی پیدا کرد.
-
Junction Table (Table میانی) جدول کمکی که توسط JPA/Hibernate برای مدیریت روابط (بهویژه در
ManyToManyیا روابطOneToManyیکطرفه) ایجاد میشود تاForeign Keyها را در خود ذخیره کند.
موارد مصاحبه ای
-
چرا در رابطه
@OneToManyیکطرفه، Hibernate به صورت خودکار یک جدول میانی (Junction Table) میسازد؟ زیرا بدون جدول میانی، برای ذخیره چندین شناسه (ID) در سمت یک (One)، یا باید دادهها را تکرار کرد (Redundancy) که باعث نقض قوانینPrimary Keyمیشود، یا باید از ساختارهای غیر استانداردی مثل لیست در یک ستون استفاده کرد. جدول میانی تمیزترین راه برای حفظ یکپارچگی دادهها در حالت یکطرفه است. -
تفاوت اصلی
@OneToManyو@ManyToOneدر پیادهسازی دیتابیس چیست؟ در@ManyToOneمعمولاً ستونForeign Keyمستقیماً در جدول "بسیار" (Many) ایجاد میشود، اما در@OneToManyاگر به تنهایی استفاده شود، منجر به ایجاد جدول میانی میشود مگر اینکه با@JoinColumnمدیریت شود. -
چگونه میتوان از ایجاد دو جدول میانی در رابطه
@ManyToManyدوطرفه جلوگیری کرد؟ باید از ویژگیmappedByدر یکی از سمتها (معمولاً سمتی که مالک رابطه نیست) استفاده کرد تا JPA متوجه شود که رابطه قبلاً در سمت دیگر تعریف شده است و هر دو از یک جدول میانی مشترک استفاده کنند. -
استفاده از
Setبه جایListدر روابط@ManyToManyچه مزیتی دارد؟ استفاده ازSetباعث میشود از ذخیره دادههای تکراری در رابطه جلوگیری شود و از نظر منطقی با مفهوم مجموعهها در پایگاه داده سازگارتر است.
سناریو کاربردی
در یک سیستم مدیریت دانشگاهی، ابتدا فرض میشود هر Student فقط یک Address دارد (OneToOne). در این حالت، JPA یک ستون address_id به جدول دانشجو اضافه میکند.
اما اگر بیزینس تغییر کند و هر دانشجو بتواند چندین آدرس (منزل، محل کار و...) داشته باشد، رابطه به One-to-Many تغییر مییابد.
در این حالت، اگر صرفاً از @OneToMany در کلاس دانشجو استفاده کنیم، Hibernate یک جدول میانی به نام student_address میسازد تا شناسههای هر دو را در کنار هم قرار دهد. برای بهینهسازی و حذف این جدول اضافی، بهتر است رابطه را به صورت Many-to-One در کلاس آدرس تعریف کنیم تا هر رکورد آدرس، مستقیماً به شناسه دانشجوی خود اشاره کند.
بیشتر بدانید
-
IDE Tip در محیط IntelliJ IDEA، زمانی که از انوتیشنهای روابط استفاده میکنید، آیکونهای کوچکی در کنار شماره خطوط (Gutter) ظاهر میشوند که با کلیک روی آنها میتوانید مستقیماً به کلاس مرتبط منتقل شوید.
-
نکته در مورد پکیجها انوتیشنهای مربوط به روابط مانند
@OneToOneو@ManyToOneهمگی باید از پکیج جدیدjakarta.persistenceایمپورت شوند. -
مدیریت جدول میانی در روابط چندبهچند، اگر نامهای پیشفرض جدول میانی یا ستونهای آن را نمیپسندید، میتوانید از انوتیشن
@JoinTableبرای شخصیسازی نام جدول و ستونهای لینکدهنده استفاده کنید.
