我在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());
}
}
菲利克斯定義
- 謝謝你的澄清。我認爲那是我所看到的。 我看到如何實現DescriptorEvent處理,幾乎與註釋一些方法一樣簡單。只需找到正確的XML文件來添加處理程序。 再次感謝! – Freiheit 2009-12-10 15:04:18
嗨Freiheit,我現在面臨同樣的問題,你會介意分享你的DescriptorEvent代碼作爲例子嗎? :)謝謝 – sunnycmf 2011-04-04 10:20:31
@Freiheit也很想看到解決方案。提前致謝。 – 2011-04-06 12:45:45