2

我正在将 JPA 与 Hibernate 一起使用。当我修改对象的一个​​属性并更新它时;生成的 SQL 显示所有列正在更新!为什么它不只更新修改后的列?有没有办法实现这一点,因为我觉得这会更加优化。

4

2 回答 2

5

默认情况下,hibernate 包括更新查询中的所有字段。如果您想排除此问题,请使用自定义更新 HQL,或者您可以配置 hibernate 以排除更新查询中未修改的字段,本文所述

这是通过添加dynamic-update="true"您的类映射来完成的。

<class ... table="your_table" .... dynamic-update="true">

在多列的大表(遗留设计)或包含大量数据的情况下,这将对系统性能产生很大影响。如此处所述,它可能会对性能产生一些影响。因此,在实施之前测量代码的性能。

阅读此处的 API以获取更多信息。

如果您使用注释,

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

它是特定于休眠的注释,在 JPA 中不可用。这是一篇链接到详细信息的好文章。

于 2012-04-25T12:20:53.927 回答
1

在过去的 4-5 天里,我遇到了一个问题,这让我慢慢发疯。

删除操作正在使用所有列,而不仅仅是主键列。

例如。

DELETE FROM MYTABLE WHERE ID=? AND NAME=? AND VALUE=?

当我删除“dynamicUpdate=true”注释时,Hibernate 开始生成正确的 SQL,即。

DELETE FROM MYTABLE WHERE ID=?

它在 Oracle 11g 上造成了令人讨厌的问题,当时VALUE是 CLOB。

于 2012-08-03T11:38:49.210 回答