[Hibernate] dynamic-update attribute

dynamic-update là gì
dynamic-update attribute cho Hibernate biết, có thêm các property không có sự thay đổi về giá trị vào lệnh SQL UPDATE hay không


Dynamic-update
1. dynamic-update=false

Giá trị mặc định của dynamic-update=false, có nghĩa là thêm cả property không được sửa đổi vào lệnh SQL update của Hibernate.

Ví dụ, lấy ra 1 đối tượng và thử thay đổi giá trị của nó và update lại vào database.

Java:
Query q = session.createQuery("from StockTransaction where tranId = :tranId ");
q.setParameter("tranId", 11);
StockTransaction stockTran = (StockTransaction)q.list().get(0);

stockTran.setVolume(4000000L);
session.update(stockTran);
Hibernate sẽ tự tạo câu lệnh update như bên dưới.

Code:
Hibernate:
    update
        mkyong.stock_transaction
    set
        DATE=?,
        PRICE_CHANGE=?,
        PRICE_CLOSE=?,
        PRICE_OPEN=?,
        STOCK_ID=?,
        VOLUME=?
    where
        TRAN_ID=?
Hibernate sẽ update tất cả các cột không được sửa đổi.


2. dynamic-update=true
Nếu set dynamic-update=true, nghĩa là bỏ qua các property không thay đổi giá trị trong lệnh SQL update của Hibernate.

Cho ví dụ, lấy ra 1 đối tượng, thử thay đổi giá trị của nó và update vào database.

Java:
Query q = session.createQuery("from StockTransaction where tranId = :tranId ");
q.setParameter("tranId", 11);
StockTransaction stockTran = (StockTransaction)q.list().get(0);

stockTran.setVolume(4000000L);
session.update(stockTran);
Hibernate sẽ generate ra lệnh update khác như bên dưới.

Code:
Hibernate:
    update
        mkyong.stock_transaction
    set
        VOLUME=?
    where
        TRAN_ID=?
Hibernate sẽ chỉ update các cột được chỉnh sửa.

Vấn đề performance
Trong 1 bảng lớn với nhiều cột (legacy design), hoặc bảng chứa dữ liệu lớn, update vài cột không thay đổi là hoàn toàn không cần thiết và tác động lớn đến performance của hệ thống.


Cách cấu hình
Cần cấu hình cho property “dynamic-update” thông qua annotation hoặc file mapping XML.

1. Annotation
Java:
@Entity
@Table(name = "stock_transaction", catalog = "mkyong")
@org.hibernate.annotations.Entity(
        dynamicUpdate = true
)
public class StockTransaction implements java.io.Serializable {

2. XML mapping
XML:
<class ... table="stock_transaction" catalog="mkyong" dynamic-update="true">
        <id name="tranId" type="java.lang.Integer">
            <column name="TRAN_ID" />
            <generator class="identity" />
        </id>

Kết luận
Với điều chỉnh nhỏ này “dynamic-update” có thể tăng performance của hệ thống và rất khuyến khích để thực hiện điều đó.


Theo dõi thêm
1. Hibernate – dynamic-insert attribute


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :D

Bài viết tham khảo tại: https://mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/
 

Bình luận