Eclipselink在未更改时更新实体字段

时间:2014-05-18 12:27:51

标签: java jpa eclipselink

我有两个实体@OneToMany(Entity1)& @ManyToOne(Entity2)双向关系。在@OneToMany关系中,我有@Cascading {Cascade.ALL}。但是当我更改最初为false的布尔属性时,对于具有@ManyToOne关系的实体,然后在事务或方法中返回false,它会导致数据库触发更新查询以将实体的布尔值设置为false,这似乎是错误的,因为它最初是错误的,并且在提交时仍然是错误的。 我使用eclipselink 2.5.1作为jpa实现。可能是什么原因?

update(Integer entityId) {
    tx.begin();
    Entity1 entity1 = findEntity(entityId);
    for(Entity2 entity2 : entity1.getEntity2List()) {
        entity2.setBooleanProperty(Boolean.TRUE);//which is initially false, we set it to true for programmatic purpose ;
        ...
        entity2.setBooleanProperty(Boolean.FALSE);//at this point db updates boolean property to false
    }
    em.merge(entity1);
    tx.commit();
}

1 个答案:

答案 0 :(得分:0)

所以我猜EclipseLink只是将第一个更改标记为“更改”字段。可能没有逻辑来保存原始值,因此检查它是否重置为原始值(必须保存所有字段的所有原始值将是一个很大的开销)。

因此,当您合并对象时,该字段标记为已分离时已更改。因此,它会在数据存储区中更新。不能说它是“错误的”,因为它是在存储所有字段的所有原始值和添加检查之间的权衡,针对单个数据存储区更新语句(并且用户只能通过它来获取所需的行为当一个字段与该值合并时更新一个字段。)