我正在将 JPA 与 Hibernate 一起使用。当我修改对象的一个属性并更新它时;生成的 SQL 显示所有列正在更新!为什么它不只更新修改后的列?有没有办法实现这一点,因为我觉得这会更加优化。
问问题
1952 次
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 回答