所以我理解这个属性 dynamic-update = true 的设置是什么,即它只考虑那些被修改的字段,并省略了为其他字段设置空值的工作。 节省开销,提高性能。
出于好奇:hibernate如何知道所有字段都被修改了?在触发更新查询之前,它是否首先将select查询生成的结果与数据库进行比较?假设是,那么是不是将开销与性能进行比较?
如果我错了,请纠正我。提前谢谢!
答案 0 :(得分:22)
所以经过近2个月的等待,我终于能够在各种来源的帮助下得出这个结论,作为我自己问题的答案:
1。)使用dynamic-update
时,Hibernate每次都必须生成相应的SQL字符串,因此Hibernate的性能成本很高
侧。换句话说,在数据库端和Hibernate端之间存在开销之间的权衡。
2.)Hibernate为每个实体缓存实际的SELECT,INSERT和UPDATE SQL字符串。这样就不必每次都需要重新创建这些语句
查找,持久化或更新实体。但是,当使用dynamic-update
时,Hibernate每次都必须生成相应的SQL字符串。
这导致Hibernate方面的性能成本。
3。)适用于非常小的&简单的表,因为使用此注释可以获得显着的性能提升。 更现实的情况是,在使用远程数据库的更广泛的表上,性能提升可能更加明显。当然,你从这里得到的里程数 不同的大多数列都需要更新。
4.。@DynamicUpdate annotation/ dynamic-update=true
用于指定每当修改实体时都应生成UPDATE SQL语句。
默认情况下,Hibernate使用缓存的UPDATE语句来设置所有表列。使用@DynamicUpdate
注释对实体进行注释时,
PreparedStatement将仅包括其值已更改的列。
总体可归纳为:
积分: Hibernate ORM 5.2.7.Final用户指南,Safari 10 MacOS ,http://memorynotfound.com/hibernate-dynamic-update-attriburte-example/
P.S。:同样适用于dynamic-insert=true/ @DynamicInsert
注释
答案 1 :(得分:2)
因此,据我了解,dynamic-insert = true使SQL不包含修改后的属性。
示例:如果要从表[User]中的行更新[name]属性,并且 dynamic-insert设置为true ,则生成的SQL将围绕以下内容:< / p>
update
USER
set
NAME="Example"
where
USER_ID=1
否则,如果 dynamic-insert设置为false ,则会生成以下SQL:
update
USER
set
NAME="Example"
AGE = ??
ADDRESS = ??
PHONE = ??
where
USER_ID=1