Hibernate - 動的挿入属性の例

Hibernate –動的挿入属性の例

動的挿入とは

dynamic-insert属性は、SQL INSERTステートメントにnullプロパティを含めるかどうかをHibernateに指示します。 それをより明確に理解するために、いくつかの例を探検しましょう。

動的挿入の例

1. dynamic-insert = false

dynamic-insertのデフォルト値はfalseです。これは、HibernateのSQL INSERTステートメントのinclude null propertiesを意味します。

たとえば、オブジェクトプロパティにnull値を設定して保存してみてください。

        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);

Hibernateの「show_sql」をtrueに設定すると、次の挿入SQLステートメントが表示されます。

Hibernate:
    insert
    into
        example.stock_transaction
        (DATE, PRICE_CHANGE, PRICE_CLOSE, PRICE_OPEN, STOCK_ID, VOLUME)
    values
        (?, ?, ?, ?, ?, ?)

挿入のHibernate will generate the unnecessary columns(PRICE_CHANGE、PRICE_CLOSE、PRICE_OPEN)。

2. dynamic-insert = true

dynamic-insertをtrueに設定した場合、これはHibernateのSQL INSERTステートメントのexclude null property valuesを意味します。

たとえば、オブジェクトプロパティにいくつかのnull値を設定して、もう一度保存してみてください。

        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);

Hibernateの「show_sql」をtrueに設定します。 別の挿入SQLステートメントが表示されます。

Hibernate:
    insert
    into
        example.stock_transaction
        (DATE, STOCK_ID, VOLUME)
    values
        (?, ?, ?)

挿入のHibernate will generate only the necessary columns(DATE、STOCK_ID、VOLUME)。

パフォーマンスの問題

数百の列を持つ非常に大きなテーブル(レガシーデザイン)、またはテーブルに非常に大きなデータボリュームが含まれる場合など、特定の状況では、不要なものを挿入するとシステムパフォーマンスが低下します。

構成方法

アノテーションまたはXMLマッピングファイルを使用して、動的挿入プロパティの値を構成できます。

1. アノテーション

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

2. XMLマッピング


        
            
            
        

結論

この小さな「dynamic-insert」の調整により、システムパフォーマンスが向上する可能性があるため、これを行うことを強くお勧めします。 しかし、私の心の中の1つの質問は、Hibernateがデフォルトでfalseに設定する理由です。

ファローアップ

1. 休止状態–dynamic-update attributeの例