Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

Entity Relationship in Java | روابط موجودیت‌ها در جاوا

📖توضیحات درس

🎥 آموزش جاوا – قسمت نود و پنجم از بوت کمپ رایگان جاوا در این ویدیو، به بررسی روابط موجودیت‌ها (Entity Relationships) در فریمورک‌های ORM مانند JPA و Hibernate می‌پردازیم. این مفاهیم برای مدیریت ارتباطات بین جداول دیتابیس و مدل‌های شی‌گرا (Object-Relational Mapping) بسیار حیاتی هستند. با هم یاد می‌گیریم که انواع روابط بین موجودیت‌ها چی هستن و چطور می‌تونیم این روابط رو در پروژه‌های جاوا با استفاده از annotation های JPA پیاده‌سازی کنیم. در این جلسه، بررسی می‌کنیم: 🔹 @OneToOne – آشنایی با رابطه یک به یک و نحوه‌ی پیاده‌سازی آن 🔹 @OneToMany – بررسی رابطه یک به چند و مثال‌های کاربردی 🔹 @ManyToOne – نحوه‌ی پیاده‌سازی رابطه چند به یک در دیتابیس 🔹 @ManyToMany – بررسی رابطه چند به چند و نحوه‌ی مدیریت آن در Hibernate 🔹 مرور کلی و نکات مهم جهت تثبیت اطلاعات لینک پروژه داخل گیت هاب: https://github.com/farzadafi/ProgrammingByFarzadAfi/tree/master/06_orm/01_orm_tutorial 💬 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشتی، می‌تونی توی گروه بپرسی؛ من یا مربی‌های گروه کمکت می‌کنیم 💬 🎯 بوت‌کمپ رایگان جاوا – آموزش پروژه‌محور برای یادگیری عمیق و ورود به بازار کار.
00:41:07🎯رایگان

📄جزوه

مفاهیم کلیدی

  • 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 برای شخصی‌سازی نام جدول و ستون‌های لینک‌دهنده استفاده کنید.