جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی


هنگامی که Spring Data JPA را با Hibernate استفاده میکنیم ما میتوانیم از ویژگی های اضافی Hibernate نیز بهره ببریم مانند DynamicUpdate@ که یک Class Level Annotation است که در کلاس های Entity استفاده میکنیم و باعث میشود تنها Column هایی که تغییر کرده اند آپدیت شوند پس برای Update کوئری SQL Statement پویا تولید میکند و تنها از Column های تغییر یافته با مقادیر آنها استفاده میکند 




Entity@ در JPA :

هنگامی که برنامه شروع بکار میکند Hibernate برای یکبار SQL Statement هایی برای عملیات CRUD کلاس های Entity میسازد و آنها را در حافظه Cache میکند در این بین دستورات Update که اول ساخته میشوند کلیه Column ها را در بر میگیرد و برای هر بار استفاده اطلاعات کلیه Column ها به دیتابیس ارسال میشود که بهینه نیست و ما تنها نیاز داریم Column هایی که تغییر کرده اند را update کنیم

ابتدا بیاییم یک Entity@ ایجاد کنیم :

@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@ کمک میکند که صحت اطلاعات بیشتر حفظ شود 











نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی