【问题标题】:Make DynamicUpdate work with session.update使 DynamicUpdate 与 session.update 一起工作
【发布时间】:2020-11-05 14:48:32
【问题描述】:

能够成功地使用 wnwrap 会话将 SQL 计数从Entity 的 SELECT + UPDATE 减少到 UPDATE (带有 @DynamicUpdate 注释),但 DynamicUpdate 在这种情况下不起作用。

doInJPA(entityManager -> {
    Session session = entityManager.unwrap( Session.class );
    for ( Post post: posts ) {
        session.update( post );
    }
});

发现 @DynamicUpdate 仅在使用 entityManager.merge 模式进行更新时有效,但在分离状态 SELECT + UPDATE 时会导致 2 个 SQL 查询。

doInJPA(entityManager -> {
    for ( Post post: posts ) {
        entityManager.merge( post );
    }
});

能否使会话展开模式使用 entityManager.merge 生成的 SQL UPDATE 查询,从而不必重新实现 DynamicUpdate ?

Note-

  1. 实体在 String 数据类型上有 @Id 键,这是 UUID.toString 字段,不是生成的字段
  2. 尝试实现 PersistableTransient isNewgetId 没有成功(即无法将 SELECT + UPDATE 在 entityManager.merge 模式的情况下减少到仅更新)
  3. 能够使用 entityManager.createNativeQuery.executeUpdate 模式使用单个 INSERT 成功插入,只是更新正在使用合并模式触发双重查询。会话展开和更新将其减少到 1 个更新,但 DynamicUpdate 不起作用
  4. 也在更大范围内尝试了事务,因此 GET + UPDATE 在同一事务中没有成功

【问题讨论】:

    标签: java spring-boot hibernate jpa spring-data


    【解决方案1】:

    动态更新仅适用于托管实体(需要至少选择一次实体),因为 Hibernate 依赖于将状态与执行 SELECT 时创建的快照进行比较。

    如果你想要真正的动态更新,我建议你看一下支持该功能的Blaze-Persistence Entity-Viewshttps://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#updatable-entity-views

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2011-11-13
      • 2012-09-13
      相关资源
      最近更新 更多