sql - 为什么 JPA 生成的更新查询包含不必要的字段?

标签 sql hibernate jpa-2.0

这可能是一个非常愚蠢的问题,但是......

我正在将 JPA 2.0 与 Hibernate 4 结合使用。我有一个包含许多字段的持久对象。

我在一个事务中创建并保留它。然后,在另一个中,我向上查找该对象并更改其一个字段的值:

try{
    tx.begin();
    MyObj object = myObjDAO.findById(objectId);
    object.setFieldA("Different value");
} finally {
    tx.commit();
}

当事务提交时,JPA 会保留此更改,但我可以从 MySQL genquery.log 中看到它生成的更新语句涉及对象上的所有字段:

439 Query
/* update uk.co.core.objects.MyObj */ update myobj set created='2012-03-06 13:39:37', modified='2012-03-06 13:39:37', version=1, fieldA='Different value', fieldB='originalValue', fieldC='originalValue' where id='objectId' and version=0; 439 Query commit

为什么它包含查询中所有未更改的字段及其现有值,而不仅仅是:

update myobj set fieldA='different value', version=1, modified='somedate' where id='objectId' and version=0;

在这个示例中,它看起来可能没有太大区别,但我有一些具有更多字段的对象,所有这些字段都包含在其更新语句中。

即使纯粹从字符串数据量的角度来看,在更新查询中仅包含更改的字段不是更快/更高效吗?如果是这样,是否有配置选项可以使其这样做?

希望您能帮忙,谢谢!

最佳答案

您可以将 hibernate 配置为排除更新查询中未修改的字段,如本 article 中所述。 .

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

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

在包含很多列(传统设计)或包含大量数据的大表中,这会对系统性能产生很大影响。

如所述 here 可能会对性能产生一些影响。因此,在实现代码之前先测量代码的性能。

阅读 API here了解更多信息。

关于sql - 为什么 JPA 生成的更新查询包含不必要的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9585452/

相关文章:

java - 我可以在 Hibernate 实体类中使用辅助/方便的方法吗?

hibernate - JPA 事务的工作原理

sql - 我可以有一个结果为 "Y"或 "N"的临时列吗?

java - JPA Hibernate实体异常: org. hibernate.MappingException

java - 如何将更新的实体与旧实体进行比较并仅将更新的值存储在数据库中

hibernate - Grails 2.3.11-对象无法持久

java - 由 : java.net.NoRouteToHostException: No route to host 引起

php - 在 CodeIgniter 中加入查询

java - 如何在 SQL 中创建 Activity 日志?

mysql - 由 : java. sql.SQLException 引起:字段 'customerNumber' 没有默认值 - hibernate 和 jpa