Farzad Afi Logo

FarzadAfi

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

GeneratedValue in JPA | GeneratedValue در JPA

📖توضیحات درس

🎥 این ویدیو قسمت نود و چهارم از بوت‌کمپ رایگان جاواست. 📚 Java ORM (JPA/Hibernate) – بررسی کامل @GeneratedValue و انواع GenerationType در این جلسه می‌ریم سراغ یکی از مهم‌ترین انوتیشن‌های JPA یعنی @GeneratedValue 🔥 همون انوتیشنی که توی ویدیوهای قبلی مجبور بودیم فعلاً ازش رد بشیم، ولی اینجا قراره کامل و حرفه‌ای بررسیش کنیم 😎 اگر می‌خوای بدونی آیدی (ID) هر Entity دقیقاً چطور تولید میشه و تفاوت روش‌های مختلف تولید شناسه چیه، این ویدیو دقیقاً برای توئه ✅ در این ویدیو بررسی می‌کنیم: 🧩 مشکل اصلی تولید ID در Entityها و چرا مهمه 📌 معرفی @GeneratedValue و نقش اون در ORM 🟢 بررسی GeneratedType.IDENTITY و نحوه کارش 🟣 بررسی GeneratedType.SEQUENCE و کاربردش در دیتابیس‌ها 🟠 بررسی GeneratedType.TABLE و اینکه چه زمانی استفاده میشه 🔵 بررسی GeneratedType.AUTO و رفتار JPA در انتخاب خودکار 🆕 بررسی GeneratedType.UUID و تولید شناسه‌های یونیک 🎯 در پایان هم یک مرور کامل داریم تا همه نکات کلیدی توی ذهنت تثبیت بشه. لینک کدی که زده شد داخل گیت هاب: https://github.com/farzadafi/ProgrammingByFarzadAfi/tree/master/06_orm/01_orm_tutorial 💬 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشتی، می‌تونی توی گروه بپرسی؛ من یا مربی‌های گروه کمکت می‌کنیم 💬 🎯 بوت‌کمپ رایگان جاوا – آموزش پروژه‌محور برای یادگیری عمیق و ورود به بازار کار 🚀
00:27:24🎯رایگان

📄جزوه

مفاهیم کلیدی

  • @GeneratedValue انوتیشنی در JPA که برای تعیین استراتژی تولید خودکار مقادیر برای فیلدهای کلید اصلی (Primary Key) استفاده می‌شود. این انوتیشن به برنامه‌نویس اجازه می‌دهد بدون درگیر شدن با مدیریت دستی آیدی‌ها، تولید مقادیر یونیک را به دیتابیس یا JPA Provider بسپارد.

  • GenerationType.IDENTITY استراتژی تولید کلید اصلی که بر قابلیت Auto-increment خود پایگاه داده تکیه دارد. در این حالت، دیتابیس وظیفه دارد پس از انجام عملیات Insert مقدار آیدی را تولید کند. این روش در دیتابیس‌هایی مانند MySQL و PostgreSQL (از طریق هویت ستون) پشتیبانی می‌شود.

  • GenerationType.SEQUENCE استراتژی که از یک شیء جداگانه در پایگاه داده به نام Sequence برای تولید مقادیر یونیک استفاده می‌کند. قبل از انجام Insert مقدار بعدی از این شیء گرفته شده و به انتیتی اختصاص می‌یابد. این روش برای برنامه‌های با مقیاس بزرگ بسیار بهینه است.

  • GenerationType.TABLE روشی که از یک جدول مجزا در دیتابیس برای شبیه‌سازی Sequence و نگهداری آخرین مقدار تولید شده استفاده می‌کند. این استراتژی مستقل از نوع دیتابیس است اما به دلیل نیاز به قفل‌گذاری و کوئری‌های اضافه، کارایی (Performance) پایین‌تری دارد.

  • GenerationType.AUTO استراتژی پیش‌فرض که در آن JPA Provider (مانند Hibernate) بر اساس نوع پایگاه داده‌ای که به پروژه متصل است، بهترین استراتژی تولید آیدی را انتخاب می‌کند.

  • Allocation Size پارامتری در SequenceGenerator که تعیین می‌کند در هر بار درخواست به دیتابیس، چه تعداد شماره آیدی رزرو شده و در حافظه (Cache) برنامه نگهداری شود. این کار باعث کاهش تعداد مراجعات به دیتابیس و افزایش سرعت می‌شود.

موارد مصاحبه ای

  • چرا استفاده از @GeneratedValue ضروری است؟ در محیط‌های عملیاتی که چندین کاربر به صورت همزمان داده درج می‌کنند، مدیریت دستی آیدی‌ها منجر به خطای Duplicate Key Value می‌شود. این انوتیشن تضمین می‌کند که هر رکورد یک کلید اصلی یونیک و نات‌نال دریافت کند.

  • تفاوت اصلی بین IDENTITY و SEQUENCE چیست؟ در استراتژی IDENTITY مقدار آیدی بعد از اجرای دستور Insert مشخص می‌شود، بنابراین Hibernate نمی‌تواند عملیات درج گروهی (Batch Insert) را به خوبی بهینه کند. اما در SEQUENCE مقدار آیدی قبل از درج از دیتابیس گرفته می‌شود که اجازه بهینه‌سازی بهتر را می‌دهد.

  • چرا SEQUENCE برای برنامه‌های با مقیاس بزرگ (Large Scale) مناسب‌تر است؟ به دلیل قابلیت Allocation Size. برنامه می‌تواند مثلاً ۵۰ عدد آیدی را یک‌جا از دیتابیس رزرو کند و در حافظه نگه دارد. تا زمانی که این ۵۰ ظرفیت پر نشود، نیازی به ارتباط مجدد با دیتابیس برای گرفتن آیدی جدید نیست که این موضوع فشار روی دیتابیس را به شدت کاهش می‌دهد.

  • کدام استراتژی بیشترین سازگاری را با انواع دیتابیس‌ها دارد؟ استراتژی TABLE؛ زیرا تمام دیتابیس‌ها از جدول پشتیبانی می‌کنند. با این حال به دلیل Overhead بالا، تنها زمانی توصیه می‌شود که دیتابیس از Identity یا Sequence پشتیبانی نکند.

  • مفهوم GenerationType.AUTO در دیتابیس PostgreSQL چگونه عمل می‌کند؟ در PostgreSQL، هایبرنت به طور هوشمند تشخیص می‌دهد که این دیتابیس از Sequence پشتیبانی می‌کند، بنابراین به طور خودکار استراتژی را روی SEQUENCE تنظیم کرده و یک شیء توالی برای آن می‌سازد.

سناریو کاربردی

در یک سیستم مدیریت دانشجویان، کلاسی به نام Student تعریف شده است. در ابتدا اگر برنامه‌نویس بخواهد آیدی هر دانشجو را دستی وارد کند، باید مدام آخرین آیدی موجود در دیتابیس را چک کرده و یکی به آن اضافه کند. این کار در سیستم‌های واقعی غیرممکن است.

با قرار دادن @GeneratedValue(strategy = GenerationType.SEQUENCE) روی فیلد آیدی، هایبرنت هنگام اجرای برنامه در PostgreSQL، یک شیء به نام student_table_seq در دیتابیس می‌سازد. در هر بار ذخیره دانشجو، هایبرنت ابتدا یک کوئری SELECT NEXTVAL می‌زند، شماره آیدی را دریافت کرده و سپس دانشجو را با آن آیدی ذخیره می‌کند. اگر Allocation Size روی ۵۰ باشد، هایبرنت یک بار عدد را می‌گیرد و برای ۵۰ دانشجوی بعدی در حافظه خودش آیدی تولید می‌کند بدون اینکه دوباره به دیتابیس درخواستی بفرستد.

بیشتر بدانید

  • نکته در مورد @SequenceGenerator برای شخصی‌سازی نام Sequence در دیتابیس و تنظیم allocationSize حتماً باید از انوتیشن @SequenceGenerator در کنار @GeneratedValue استفاده کنید و نام آن‌ها را از طریق فیلد generator به هم متصل کنید.

  • نکته در مورد تنظیمات Hibernate برای مشاهده نحوه ساخت جداول و Sequenceها در کنسول، می‌توانید در فایل persistence.xml خاصیت hibernate.hbm2ddl.auto را روی create-drop قرار دهید تا در هر بار اجرای برنامه، جداول پاک شده و مجدد با ساختار جدید ساخته شوند.

  • توسعه با UUID اگر پروژه شما به جای اعداد از رشته‌های طولانی و منحصربه‌فرد جهانی (UUID) استفاده می‌کند، JPA استراتژی مخصوصی برای تولید خودکار این نوع آیدی‌ها نیز دارد که از طریق GenerationType.UUID در نسخه‌های جدید در دسترس است.