这可能是一个非常愚蠢的问题,但是......
我正在使用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查询
/ * 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',其中id ='objectId'且version = 0; 439查询提交
为什么它包含查询中所有未更改的字段及其现有值,而不仅仅是:
更新myobj set fieldA ='different value',version = 1,modified ='somedate',其中id ='objectId'且version = 0;
在这个例子中看起来可能没什么区别,但是我有一些包含更多字段的对象,所有这些字段都包含在它们的更新语句中。
即使纯粹从字符串数据的角度来看,它是否更快/更高效,只包括更新查询中的更改字段?如果是这样,是否有配置选项可以这样做?
希望你能提供帮助,谢谢!
答案 0 :(得分:1)
您可以按照此article中的说明将hibernate配置为排除更新查询中的未修改字段。
这是通过在类映射中添加dynamic-update="true"
来完成的。
<class ... table="your_table" .... dynamic-update="true">
在包含许多列(旧设计)或包含大量数据的大型表中,这将对系统性能产生很大影响。
告诉here会产生一些性能影响。因此,在实现代码之前,请先测量代码的性能。
阅读API here以获取更多信息。
答案 1 :(得分:1)
要坚持你的ORM必须的delta:
这比仅在所有列上发布标准更新要复杂得多,而且由于复杂性增加,也会显着降低 性能。
答案 2 :(得分:0)
现在发现了在同一个问题中提出两个问题的危险。 ManuPK和Perception都提供了很好的,有用的,正确的答案。但是我收到了ManuPk的更多信息和理解,因此我接受了它。
绝对同意他的观点 - 只应对某些表格设置属性,并且必须在前后测试性能。
将来,我会尝试让我的问题更具针对性。