这可能是一个非常愚蠢的问题,但是......
我正在将 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/