هنگامی که Spring Data JPA را با Hibernate استفاده میکنیم ما میتوانیم از ویژگی های اضافی Hibernate نیز بهره ببریم مانند DynamicUpdate@ که یک Class Level Annotation است که در کلاس های Entity استفاده میکنیم و باعث میشود تنها Column هایی که تغییر کرده اند آپدیت شوند پس برای Update کوئری SQL Statement پویا تولید میکند و تنها از Column های تغییر یافته با مقادیر آنها استفاده میکند
@Entity public class Account { @Id private int id; @Column private String name; @Column private String type; @Column private boolean active; // Getters and Setters }
یک JPA Repository ایجاد میکنیم :
@Repository public interface AccountRepository extends JpaRepository<Account, Integer> { }
حالا با استفاده از AccountRepository که ساختیم نام یک Entity را آپدیت میکنیم :
Account account = accountRepository.findOne(ACCOUNT_ID); account.setName("Test Account"); accountRepository.save(account);
و کوئری Update آن به شکل زیر خواهد بود که در آن کلیه Column ها آورده شده است :
update Account set active=?, name=?, type=? where id=?
Entity@ در JPA همراه با DynamicUpdate@ :
همانطور که مشاهده کردیم ما name را تغییر دادیم و خواستیم آنرا در دیتابیس ذخیره کنیم ولی در کوئری ساخته شده عملا تمامی فیلد ها استفاده شد
حالا در طراحی کلاس Entity@ از DynamicUpdate@ هم استفاده میکنیم :
@Entity @DynamicUpdate public class Account { // Existing data and methods }
و اگر دوباره کوئری Update شدن name را ارسال کنیم بدین شکل خواهد بود :
update Account set name=? where id=?
* نکته ای که وجود دارد این است که Hibernate اطلاعات موجود در Entity را رصد و Cache میکند و مقادیر تغییر یافته را مقایسه میکند که این خود یک Overhead اضافی خواهد داشت پس تنها موقعی باید از DynamicUpdate@ استفاده کنیم که واقعا نیاز باشد و Overhead آن بر نیازی که داریم ارجحیت داشته باشد
مثلا موقعی که Entity ما دارای تعداد بسیار زیادی فیلد باشد و آپدیت های ما تعداد کمی فیلد را در هر بار نیاز داشته باشد و یا قفل رکورد ضعیفی داشته باشیم استفاده از DynamicUpdate@ کمک میکند که صحت اطلاعات بیشتر حفظ شود