Hibernate - Exemple d’attribut dynamic-insert

Hibernate - exemple d'attribut d'insertion dynamique

Qu'est-ce que l'insertion dynamique

L'attribut dynamic-insert indique à Hibernate s'il faut inclure les propriétés nulles dans l'instruction SQL INSERT. Explorons quelques exemples pour mieux le comprendre.

Exemple d'insertion dynamique

1. insert dynamique = faux

La valeur par défaut de dynamic-insert est false, ce qui signifieinclude null properties dans l'instruction SQL INSERT d'Hibernate.

Par exemple, essayez de définir des valeurs nulles pour les propriétés d'un objet et enregistrez-le.

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

Activez Hibernate «show_sql» sur true, vous verrez l'instruction SQL d'insertion suivante.

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) pour l'insertion.

2. insert dynamique = vrai

Si vous définissez l'insertion dynamique sur true, ce qui signifieexclude null property values dans l'instruction SQL INSERT d'Hibernate.

Par exemple, essayez de définir des valeurs nulles pour les propriétés d'un objet et enregistrez-le à nouveau.

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

Activez Hibernate «show_sql» sur true. Vous verrez les différentes instructions d'insertion SQL.

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

Hibernate will generate only the necessary columns (DATE, STOCK_ID, VOLUME) pour l'insertion.

Problème de performance

Dans certaines situations, comme une très grande table avec des centaines de colonnes (conception héritée), ou une table contenant un volume de données extrêmement important, insérer quelque chose de non nécessaire réduira définitivement les performances de votre système.

Comment le configurer

Vous pouvez configurer la valeur des propriétés d'insertion dynamique via une annotation ou un fichier de mappage XML.

1. Annotation

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

2. Mappage XML


        
            
            
        

Conclusion

Ce petit ajustement «dynamic-insert» peut augmenter les performances de votre système et vous recommande vivement de le faire. Cependant, une question dans mon esprit est pourquoi Hibernate l'a défini sur false par défaut?

Suivre

1. Hibernation - Exemple dedynamic-update attribute