dynamic-update = true如何在hibernate内部工作?

时间:2017-01-13 11:09:20

标签: hibernate

所以我理解这个属性 dynamic-update = true 的设置是什么,即它只考虑那些被修改的字段,并省略了为其他字段设置空值的工作。 节省开销,提高性能。

出于好奇:hibernate如何知道所有字段都被修改了?在触发更新查询之前,它是否首先将select查询生成的结果与数据库进行比较?假设是,那么是不是将开销与性能进行比较?

如果我错了,请纠正我。提前谢谢!

2 个答案:

答案 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将仅包括其值已更改的列。

总体可归纳为:

  1. 运行时SQL生成开销。
  2. 不再使用PreparedStatement(缓存)。
  3. 性能开销。
  4. 积分 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