شما معمولا در هایبرنت به ازای هر عمل دیتابیسی یک session باز می کنید کارهای مورد نظر خودتون رو در متن اون session انجام میدید و بعد session رو می بندید این session به مانند یک ظرفی هس که هر entity که درش بازیابی می کنید (از دیتابیس به کمک متد find ) یا یک آبجکت جدید را در دیتابیس ذخیره می کنید ( به کمک متد save ) یا حتی کوییری می زنید به دیتابیس حین این کار که session باز هس یکسری entity داخل اون ظرف نگهداری میشه و البته کوییری هایی که شما به زبان htql نوشتید و تبدیل شده به sql ( توسط هایبرنت ) همه اینها داخل ظرفی بنام session نگهداری میشه اسم اون ظرف هس first level cache
مسوول نگهداری کش سطح اول بر عهده session است
second level cache
فرض کنید شما در پروژه تون همزمان چندین session باز دارید و همگی به صورت مستقل از همدیگه در حال کار هستند در کنار این session ها یک ظرف مشترک بین همه session ها هس که مسوول هندل کردن و نگهداری اون برعهده sessionFactory است وقتی داخل session نیاز به دسترسی به یک نمونه entity صادر میشه اول داخل ظرف مخصوص اون session بررسی میشه اگه اونجا پیدا شد بهش تحویل داده میشه اگه پیدا نشده سراغ اون ظرف مشترک بین همه session رفته از اونجا نمونه entity رو میخواد و اگه اونجا هم نباشه سراغ دیتابیس میره و کوییری میزنه به دیتابیس و از اون جا داده بازیابی شده و این بار هم روی کش سطح دو و سطح یک کپی میشه