Soft delete در hibernate

ارسال پست
Saeid
پست: 1
تاریخ عضویت: جمعه 4 مرداد 1398, 9:40 pm

Soft delete در hibernate

پست توسط Saeid » جمعه 4 مرداد 1398, 10:13 pm

با سلام
برای soft delete بنده یک مشکلی دارم و دنبال راه حل best practice هستم
مشکلم اینه من میخام ب جای پاک کردن رکورد از دیتابیس یک تگ مثل isdeleted برای اون رکورد ست کنم ولی پاکش نکنم و به کاربر معمولی دیگه نشون ندم منتها کاربران مدیر بتونند اینگونه از رکوردها را ببینند یعنی همه entity های من یک فیلد از نوع boolean به نام isdeleted دارند ک وقتی true باشه بعنی رکورد پاک شده و وقتی false باشه یعنی پاک نشده
برای soft delete دو تا راه حل بنده دیدم
راه حل اول اینه که بیام برای هر entity از @where استفاده کنم ک بگم فقط رکوردهای isdeleted نشده را نشون بده این کار یک بدی داره و اون اینکه دیگه نمیشه رکوردهای با تگ isdeleted شده را ب کاربری نشون داد
همچنین این راه حل میگه همچنین برای پاک کردن بیا @sqlDelete را را به ازای هر entity دوباره نویسی (override) کن و دستور اپدیت به جای delete صادر کن

راه حل دوم میگه گه باید jparepository را overrideکنی با یک interface و در اونجا متد delete را override کن و دستور اپدیت را صادر کن و متدهای دیگری برای fetch کردن رکوردهای isdeleted شده و نشده صادر کن
مشکل این روش اینه ک در هنگام delete باید تمامی جداول یعنی تمامی entity های مرتبط به entity جاری را پیدا کنی و اونا
را هم اپدیت کنی ک این کار زمان بره ب نظرم
همچنین باید تمامی متدهای crud ام را با کویری شون را دستی بنویسم

راه حلی ک من دارم ترکیب این دو راه حل
روی تمامی entity هام از @sqlDelete استفاده کنم چرا ک وقتی دستور delete صادر میشه خود hibernate با توجه به cascade type میاد entity های مرتبط را هم پاک میکنه و خیالم راحته ک entity جا نمی افته
بعد برای نمایش رکوردهای با تگ های isdeleted شده و نشده اومدم از این روش استفاده کردم که
متدهای قبلیمو در crudRepository مو دست نزدم و فرض کردم ک وقتی یک سرویسی دنبال یک ابجکت یا لیستی از ابجکت ها در دیتابیس هست به طور پیش فرض رکوردهای isdeleted نشده را میخواد
فقط متدهام را تبدیلشون کردم به متد defult و از تو اون اومدم گفتم برو isdeleted نشده ها را فراخوانی کن مثال زیر را توجه داشته باشید

Public interface UserRepository extends jpaRepositiry... }
User findByUsernameAndIsDeleted(String usrname,boolean isdeleted)
defult User findByUsername(String username)
{
return findByUsernameAndIsDeleted(usrname,false)
...
....
}
خواستم بدونم آیا روش دیگه ای شما مدنظرتون هست
و این روش خوبه اصلا یا نه
با تشکر

java2
مدیر کل سایت
پست: 178
تاریخ عضویت: پنج شنبه 13 دی 1397, 6:49 pm

Re: Soft delete در hibernate

پست توسط java2 » شنبه 5 مرداد 1398, 7:23 pm

استاد بهادر همیشه توصیه می کنند تا لایه Generic Repository خود را پیاده کنید و از Generic Repository مخصوص خود استفاده کنید، در مورد شما عملیات حذف منطقی یا همان فلگ گذاری را در لایه Generic Repository انجام دهید

ارسال پست