这可能是一个非常愚蠢的问题,但...为什么JPA生成的更新查询包含比必要的字段更多的字段?
我使用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查询
/*更新uk.co.core.objects.MyObj * /更新MyObj中集创建= '2012-03-06 13时39分37秒' ,modified ='2012-03-06 13:39:37',version = 1,fieldA ='Different value',fieldB ='originalValue',fieldC ='originalValue'其中id ='objectId'和版本= 0; 439查询提交
为什么它包括所有不变字段及其现有值查询,而不仅仅是:
更新MyObj中设置FIELDA =“不同的价值”,版本= 1, modified ='somedate'其中id ='objectId'和version = 0;
这个例子看起来可能没有太大区别,但我有一些对象具有更多字段,所有这些对象都包含在它们的更新语句中。
即使纯粹从字符串数据的角度来看,更新查询中只包含更改的字段,它会不会更快/更高效?如果是这样,是否有一个配置选项可以让它这样做?
希望你能帮忙,谢谢!
一个专门的** HQL **是一个好主意,当你确切知道要更新什么时,无论版本。但是恐怕你的解决方案可能是**性能开销,因为对象必须加载到内存中,然后应该进行比较**。 – ManuPK 2012-03-06 14:37:59