2013-07-01 38 views
2

我正在研究一個有時在JPA管理實體上調用setter的應用程序。爲什麼JPA將這些對象標記爲髒,即使這些值沒有改變?爲什麼JPA將對象標記爲髒,即使值沒有改變?

例如我有一個對象,它有一個子對象。我可以撥打entity.setMyChild(entity.getMyChild()),JPA仍然顯然將該實體視爲髒,並將更新它。

+0

也許JPA提供者只能看到setter調用(使用字節碼操縱的攔截器)而不是實際值。 –

+0

忘記JPA,如果您自己管理它,那麼考慮到可以多次調用相同的setter,那麼如何保證該值實際上不會改變數據庫中的值? –

+0

這是* not *在JPA規範中;一些JPA提供者(例如DataNucleus JPA)肯定不會在這種情況下將這樣的領域標記爲「骯髒」。所以它是特定於供應商的,並且有很多方法可以完成(參見Stephen C答案) – DataNucleus

回答

3

你會需要跟誰寫的規格(和實現)一個明確的答案的人,但我能想到幾個似是而非的理由。

  • 您如何確定舊值和新值沒有改變?

    • 您可以致電equals(Object)(對象類型)!但是,使用equals這是否是「健全的」?那些對平等沒有貢獻但卻仍然需要堅持的領域呢?

    • 你可以使用對象的身份。但是,如果應用程序無情地創建「平等」的實例呢?

    總之,很難提出一個合適的「改變值」的定義。

  • 怎麼樣的成本?對於「僅在更改時設置爲髒」才能正常工作,您需要比較每個set呼叫的舊值和新值。假設我們使用了equals(Object)。考慮撥打電話set可能需要很多次,而且撥打equals(Object)可能很貴,我們可能會遇到嚴重的性能問題。

我懷疑他們會考慮這種事情,並決定簡單的「設機構髒」的模式會更容易使用。無論如何,如果您不喜歡JPA在這種情況下工作的方式,您可以隨時在持久對象的API中添加另一個setter方法,它只調用JPA setter,當新值不同時...根據到一些模型。

0

如果沒有更改,EclipseLink不執行更新。什麼是正在生成的更新SQL?你是否改變了子對象的ID,或者你有兩個對象的副本?

請包括您的所有代碼和SQL日誌。

相關問題