2009-12-09 72 views
7

我在StackOverflow上遇到了一些類似的問題,嘗試瞭解決方案,但沒有找到答案。EclipseLink JPA`@ PreUpdate`調用不存在

我正在使用相當常見的JPA策略來設置一些實體的最後修改時間。設置列和字段,然後標記一個方法​​,並讓它設置爲等於當前時間。

問題是我可以在調試器中看到該方法正在被調用,並且該字段正在更新,但是在我的數據庫日誌中,我只看到一個SQL調用來更新不包含UPDATE的更改字段爲時間戳字段。

使事情變得更復雜@PrePersist完美地工作,只有​​表現出這種行爲。

到目前爲止我找到的最接近的解釋是在這LINK

在類似的問題:#1725699和#1745890

我使用的EclipseLink v2和JPA V1與GlassFish v2中的兼容性。

我試圖直接在實體類的方法中使用這兩個註釋以及使用@EntityListener註釋附加到實體類的EntityListener

我懷疑這是EclipseLink中的一個錯誤,但我無法證明它。

錯誤與否我會非常喜歡這個簡單的操作工作。這個實現有什麼問題嗎?這是EclipseLink中的一個已知問題嗎?這是JPA中的一個已知問題嗎?有沒有解決的辦法?

缺少去數據庫和使用觸發器,是否有一個備用路徑讓我的Java代碼設置updated_on時間戳?

感謝您的建議!

代碼片段如下。

實體領域:

@Column(name = "updated_on") 
@Temporal(TemporalType.TIMESTAMP) 
private Date updatedOn; 
@Column(name = "created_on") 
@Temporal(TemporalType.TIMESTAMP) 
private Date createdOn; 

註釋更新方法:

@PreUpdate 
public void setUpdatedOn(Timestamped object) { 
    object.setUpdatedOn(new Date()); 
} 

@PrePersist 
public void setCreatedOn(Timestamped object) { 
    if (object.getCreatedOn()==null) { 
     object.setCreatedOn(new Date()); 
    } 
} 

回答

4

您所提供的鏈接精確地描述了您的情況:在骯髒的檢查,被稱爲@PreUpdate方法之前檢測到更新的字段並且不再檢測@PreUpdate方法中的更改。這可能是出於性能原因而完成的,因爲在大型對象圖上髒檢查可能非常昂貴。現在看來,您的選擇是使用特定於提供者的機制(DescriptorEvent)或切換到Hibernate。

+0

菲利克斯定義

<property name="eclipselink.temporal.mutable" value="true" /> 

- 謝謝你的澄清。我認爲那是我所看到的。 我看到如何實現DescriptorEvent處理,幾乎與註釋一些方法一樣簡單。只需找到正確的XML文件來添加處理程序。 再次感謝! – Freiheit 2009-12-10 15:04:18

+0

嗨Freiheit,我現在面臨同樣的問題,你會介意分享你的DescriptorEvent代碼作爲例子嗎? :)謝謝 – sunnycmf 2011-04-04 10:20:31

+0

@Freiheit也很想看到解決方案。提前致謝。 – 2011-04-06 12:45:45

3

Mybe有點晚,但對於信息的完整性,這是不是一個錯誤,但記錄的行爲:

日期或日曆類型假定是在默認情況下可變的,如果需要要調用日期或日曆上的設置方法,那麼必須將映射設置爲@Mutable。

對於日期和日曆類型,全局持久性屬性「eclipselink.temporal.mutable」也可以設置爲「true」。

所以,無論是標註

@Mutable 
@Column(name = "updated_on") 
@Temporal(TemporalType.TIMESTAMP) 
private Date updatedOn; 

或在persistence.xml中

+0

非常感謝Michele,它和我一起工作就像一個魅力。 – 2016-10-22 21:37:07

+0

不客氣:) – 2016-10-23 09:22:09

+0

我已經添加了這個註釋,但它仍然無法正常工作([請參閱我的問題](https://stackoverflow.com/questions/47081932/prepersist-not-working-with-mappedsuperclass-in-hibernate -Spring環境))。任何想法爲什麼? – displayname 2017-11-02 18:30:40