【问题标题】:Optimize Hibernate entities saving?优化 Hibernate 实体保存?
【发布时间】:2010-10-05 07:52:33
【问题描述】:

有没有办法减少 SQL 插入和 SQL 更新中不必要的/空字段?

例如,我有一个单一的休眠实体类映射到一个有 10 列的表。数据的填充实际上分两个阶段完成。当用户提交请求时,我会将请求信息插入到带有 hibernate 实体的表中,但只填充 7 个字段。经过一些处理(例如等待其他用户交互),我将填充剩余的 3 个字段(使用上一次插入给出的 id)。

如果我坚持使用单个实体类,对于第二次更新,我执行的步骤如下:

1) 加载id标识的实体

2) 保存实体,它会生成似乎将所有字段都发送过来的 sql。

另外,我创建了两个实体类,并指向同一个表并分别保存。

有人有更好的建议吗?

肯特

编辑:

我真正想要实现的是以下效果: 插入 t(id,field1,field2) (?,?,?) 更新 t 设置字段 3=?字段4=? id=?

我现在可以通过 dynamicUpdate=true 实现的最佳效果是 插入 t(id,field1,field2) (?,?,?) 从 t 中选择 field1,field2,field3,field4 其中 id=? 更新 t 设置字段 3=?字段4=? id=?

有没有办法消除该选择语句?插入后原始持久化对象不会存储在内存中的任何位置。

附加说明。实体类使用 Hibernate 验证进行注释。我目前正在尝试达到上述预期效果,所以我将它们注释掉。但是当我重新打开它们时,由于@NotNull 和@NotEmpty 出现验证错误。

【问题讨论】:

  • dynamicUpdate = true 完美运行。

标签: java hibernate transactions


【解决方案1】:

如果添加注释:

@org.hibernate.annotations.Entity(dynamicUpdate = true)

在您的实体顶部,只有已更改的字段才会发送到数据库。

【讨论】:

  • 我试过了,效果很好。但是有没有办法消除我必须首先加载实体的步骤?我想消除对数据库的额外“选择”语句(假设实体未缓存在会话中)
  • 我确信他们有一些技巧可以实现这一目标。 (例如,将原始对象保留在某处,然后进行合并或使用批量更新)但是,如果额外的选择语句担心您可能休眠不是正确的选择。对我来说,这是一个性能与可维护性的问题。
猜你喜欢
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2012-08-15
  • 2016-09-17
相关资源
最近更新 更多