2014-05-18 29 views
0

我有兩個實體@OneToMany(Entity1)& @ManyToOne(Entity2)雙向關係。在@OneToMany關係中,我有@Cascading {Cascade.ALL}。但是,當我改變最初爲false的布爾屬性時,實體的@ManyToOne關係爲true,然後返回到事務或方法內的false,它會導致數據庫觸發更新查詢以將實體的布爾值設置爲false,這似乎因爲它最初是錯誤的,並且在提交時仍然是錯誤的。 我使用eclipselink 2.5.1作爲jpa實現。可能是什麼原因?Eclipselink更新實體字段時,它不會改變

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(); 
} 

回答

0

所以我猜EclipseLink只是把第一次改變標記爲「更改」字段。可能沒有邏輯來保存原始值,並因此檢查它是否被重置爲原始值(這將是必須保存所有字段的所有原始值的重要開銷)。

因此,當您合併標記爲被分離時已被更改的對象。因此它在數據存儲中得到更新。不能說它是「錯誤的」,因爲它是在存儲所有字段的所有原始值和添加檢查之間進行權衡,針對單個數據存儲更新語句(並且用戶擁有它們以便僅通過它們獲得其期望的行爲在將要與該值合併時更新字段)。

+0

如果我使用eclipselink的歷史支持保留所有更改的歷史記錄,那將會出現問題。它記錄所有更新,即使不需要保存這樣的不必要的更新,而且如果我以這種方式更改大量實體,它也是開銷。 – Odgiiv

相關問題