بصورت پیش فرض persistence context در آخر هر تراکنش با دیتابیس هماهنگ ( sync ) است ولی در برخی مواقع شما نیاز دارید تا تغییرات در مموری نگه داشته شود و تنها زمانی در پایگاه داده اعمال شود که شما می خواهید بعنوان مثال زمانی که کاربر وارد فرم ویرایش می شود
1. از پایگاه داده entity بر اساس شناسه آی دی لود می شود و مقادیر فرم ست می شود.
2. کاربر مقادیر را تغییر می دهد و پس از بروز رسانی ، فقط تغییرات در پایگاه داده بروز می شود .
Commit
اگر شما از هایبرنیت استفاده نکنید یک کوئری هنگام لود شدن فرم باید اجرا کنید و یک کوئری دیگر هنگام بروز رسانی ( چونکه تراکنش بعد از render شدن صفحه بسته می شود یعنی commit )
Flush
هایبرنیت یک امکان ویژه ای دارد که بقیه ی پیاده سازی های JPA ندارند و آن این است که شما می توانید با تنظیم flushmode از AUTO به manual فقط و فقط تغییرات را بدون اینکه نراکنش را ببندید تغییرات را با flush با دیتابیس هماهنگ کنید در این حالت دیگر نیازی به کوئری اضافه نیست چون آبجکت در persistence context وجود دارد و فقط dirty شده اما در حالت قبل آبجکت به اصطلاح detach و تراکنش بسته می شود.
یک مثال فنی دیگر : در فریم ورک هایی مثل اسپرینگ از آنجاییکه هر تراکنش به ازای هر متد است ( تراکنش در ابتدای متد شروع و در پایان متد تمام می شود ) و تراکنش توسط فریم ورک اسپرینگ هندل می شود . تراکنش با پایان هر متد commit می شود شما نمی توانید سناریو ی زیر را انجام دهید
1. در یک متد عملیات insert را انجام دهید تغییرات را flush کنید
2. سپس مقادیر وارد شده را select بزنید
@Transactional
public void multipleTaskInOnTransaction()
{
entityManager.persist(user);
entityManager.flush();
//user should be available in database but it is not
jdbcTemplate.query("select * from users");
//returns nothing until you exit the methods
}
اما در فریم ورک های بهتر اینکار براحتی قابل انجام است .