【问题标题】:How dynamic-update=true works internally in hibernate?dynamic-update=true 如何在 hibernate 内部工作?
【发布时间】:2017-01-13 11:09:19
【问题描述】:

所以我了解设置此属性 dynamic-update=true 的作用,即它只考虑那些已修改的字段,而忽略为其他字段设置空值的工作。 节省开销,提高性能。

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

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

【问题讨论】:

  • 有什么奇怪的?我正在搜索这个问题,发现了两个类似的问题,链接中的一个和这个。我已经查看了日期,然后您就来了,否则我会标记另一个。有什么问题?这只是一个重复的标志,而不是反对或冒犯。

标签: hibernate


【解决方案1】:

因此,经过将近 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. 性能开销。

致谢Hibernate ORM 5.2.7.Final 用户指南,http://memorynotfound.com/hibernate-dynamic-update-attriburte-example/ , https://stackoverflow.com/a/3405560/1004631

P.S.:dynamic-insert=true/ @DynamicInsert 注释也适用

【讨论】:

  • 1)、2)、4) 是一回事,3) 很模糊。此外,摘要不正确(为什么没有准备好的语句用于此标志?)。
  • 我也在寻找这个问题的答案,在我看来,这个特定的答案并没有涵盖主要问题。第 4 点)更接近真正的答案,但并不完全……
  • hmm,仅基于更新的列生成字符串,而不是更新数据库中的 N 个列。我会抓住机会减少更新声明。尤其是当您有更新触发器在更新数据库中的列时执行操作时。
  • 我的问题是为什么 Hibernate 默认会更新所有字段?不知何故,特定字段的更新比所有字段的更新更复杂,甚至未修改?
  • 如果修改注解完全一样,为什么还要使用DynamicUpdate注解?
【解决方案2】:

因此,据我了解,dynamic-insert=true 使 SQL 不包含修改后的属性。

示例:如果您要从表 [User] 中的一行更新 [name] 属性并且 dynamic-insert 设置为 true,那么生成的 SQL 将是这样的:

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

【讨论】:

  • 从你的评论来看 dynamic-insert 和 dynamic-update 是等价的,会导致更新操作。是这样吗?
猜你喜欢
  • 2019-01-13
  • 2010-10-14
  • 2013-09-28
  • 2012-08-01
  • 2011-12-10
  • 2018-02-10
  • 2014-09-29
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多