[Hibernate] dynamic-insert attribute

dynamic-insert là gì
Attribute dynamic-insert cho Hibernate biết liệu có thêm các property có giá trị null vào câu SQL INSERT hay không. Xem vài ví dụ để hiểu rõ hơn về nó.


Ví dụ về dynamic-insert


1. dynamic-insert=false

Giá trị mặc định của dynamic-insert là false, nghĩa là thêm các property có giá trị null vào câu SQL INSERT của Hibernate.

Ví dụ, thử set null cho một số property của object và lưu nó.
Java:
StockTransaction stockTran = new StockTransaction();
//stockTran.setPriceOpen(new Float("1.2"));
//stockTran.setPriceClose(new Float("1.1"));
//stockTran.setPriceChange(new Float("10.0"));
stockTran.setVolume(2000000L);
stockTran.setDate(new Date());
stockTran.setStock(stock);

session.save(stockTran);
Enable Hibernate "show_sql” là true, sẽ thấy lệnh SQL insert bên dưới.

Java:
Hibernate:
    insert
    into
        mkyong.stock_transaction
        (DATE, PRICE_CHANGE, PRICE_CLOSE, PRICE_OPEN, STOCK_ID, VOLUME)
    values
        (?, ?, ?, ?, ?, ?)
Hibernate sẽ tạo ra các cột không cần thiết (PRICE_CHANGE, PRICE_CLOSE, PRICE_OPEN) để insert.


2. dynamic-insert=true
Nếu set dynamic-insert là true, nghĩa là không thêm có property có giá trị null vào lệnh INSERT SQL của Hibernate.

Cho ví dụ, thử set null cho vài property của đối tượng và lưu nó một lần nữa.

Java:
StockTransaction stockTran = new StockTransaction();
//stockTran.setPriceOpen(new Float("1.2"));
//stockTran.setPriceClose(new Float("1.1"));
//stockTran.setPriceChange(new Float("10.0"));
stockTran.setVolume(2000000L);
stockTran.setDate(new Date());
stockTran.setStock(stock);

session.save(stockTran);
Enable Hibernate "show_sql” là true, sẽ thấy sự khác biệt của câu SQL insert.

Code:
Hibernate:
    insert
    into
        mkyong.stock_transaction
        (DATE, STOCK_ID, VOLUME)
    values
        (?, ?, ?)
Hibernate sẽ chỉ tạo ra các cột cần thiết (DATE, STOCK_ID, VOLUME) để insert.

Vấn đề về performance
Trong tình huống nhất định, một bảng lớn với hàng trăm cột (legacy design), hoặc một bảng chứa nhiều dữ liệu, câu insert với nhiều cột không cần thiết sẽ làm giảm performance của hệ thống.


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


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

2. XML mapping
XML:
<class ... table="stock_transaction" catalog="mkyong" dynamic-insert="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-insert” có thể tăng performance của hệ thống và rất khuyến khích để thực hiện điều đó. Tuy nhiênn, có một câu hỏi là tại sao Hiberante thiết lập giá trị mặc định của nó là false?


Theo dõi thêm
1. Hibernate – dynamic-update 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-insert-attribute-example/
 
Sửa lần cuối:

Bình luận

Joe

Thành viên VIP
21/1/13
2,962
1,307
113
Java:
dynamicInsert = true
Tuy nhiênn, có một câu hỏi là tại sao Hiberante thiết lập giá trị mặc định của nó là false?
This annotation triggers Hibernate to wake up from its deep winter-sleep for skipping the values which are null. That improves the performance as you correctly mentioned. However, the price could be very dear if columns are declared NOT NULL (i.e. not null by default). In this case the performance gain reverses to performance loss by auxiliary works such as to keep the consistency of the entity data by declaring "not null by default" and by additional initiation of the data (e.g. an empty string with two after another single quote), etc.
 
Sửa lần cuối:

quydtkt

Administrator
1/11/19
381
36
28
26
I think so. May be, hibernate author wants to unify the generated sql statement