什么是动态插入
dynamic-insert属性告诉Hibernate是否在SQL INSERT语句中包括null属性。 让我们探索一些示例以更清楚地了解它。
动态插入示例
1. dynamic-insert = false
动态插入的默认值为false,这意味着在Hibernate的SQL INSERT语句中包含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
mkyong.stock_transaction
(DATE, PRICE_CHANGE, PRICE_CLOSE, PRICE_OPEN, STOCK_ID, VOLUME)
values
(?, ?, ?, ?, ?, ?)
Hibernate将为插入生成不必要的列 (PRICE_CHANGE,PRICE_CLOSE,PRICE_OPEN)。
2. dynamic-insert = true
如果将dynamic-insert设置为true,则意味着在Hibernate的SQL INSERT语句中排除空属性值 。
例如,尝试为对象属性设置一些空值,然后再次保存。
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。 您将看到不同的insert SQL语句。
Hibernate:
insert
into
mkyong.stock_transaction
(DATE, STOCK_ID, VOLUME)
values
(?, ?, ?)
Hibernate将仅生成用于插入的必要列 (DATE,STOCK_ID,VOLUME)。
性能问题
在某些情况下,例如具有数百列的超大表(旧式设计),或者表包含非常大的数据量,插入某些不必要的操作肯定会降低系统性能。
如何配置
您可以通过注释或XML映射文件配置动态插入属性值。
1.注释
@Entity
@Table(name = "stock_transaction", catalog = "mkyong")
@org.hibernate.annotations.Entity(
dynamicInsert = true
)
public class StockTransaction implements java.io.Serializable {
2. 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>
结论
这种小的“ 动态插入 ”调整可能会提高您的系统性能,强烈建议您这样做。 但是,我想到的一个问题是,为什么Hibernate默认将其设置为false?
跟进
1. Hibernate – 动态更新属性示例
翻译自: https://mkyong.com/hibernate/hibernate-dynamic-insert-attribute-example/