2017-05-30 97 views
0

正常工作,我有一個基礎的實體類@version標註不JPA/EclipseLink的

其中字段(時間戳)中的一個具有@版本屬性,那麼JPA會自動增加值。

但是,有時時間戳值沒有得到更新,編輯日期小於創建日期,但這從來不會發生在理論上。

我不是以編程方式設置編輯的值。

這裏是我的實體類:

public class BaseEntity implements Serializable { 

@Column(name = "CREATED") 
private Timestamp created; 

@Column(name = "EDITED") 
@Version 
private Timestamp edited; 

// other fields, getters and setters 

} 

看了關於這個@version註釋很多文章,但我不明白爲什麼這個值將不會更新,什麼是這背後的原因。

如果有人能幫我,將是巨大的

感謝

+0

檢查值已在管理實體的事務提交後改變(或沖洗被調用)。常見的錯誤是查看分離實體中的值或者事務與數據庫同步之前的值,因爲JPA僅在即將訪問數據庫時更新值。否則,請提供有關您看到此問題的情況的更多信息,而不會看到它。 – Chris

回答

1

下面是一些基本準則:

  • 檢查,如果你輸入正確的包javax.persistence.Version
  • 在保存對已存在的實體的更改時使用obj = entityManager.merge(obj);
  • 切勿手動更改版本字段的值。實體經理會照顧它。

爲了進一步調試編輯您的persitence.xml並添加以下行屬性:

<property name="eclipselink.logging.level" value="FINE"/> 
<property name="eclipselink.logging.parameters" value="true"/> 
<property name="eclipselink.logging.sql.level" value="FINE"/> 

這將使測井精細,併產生大量的輸出。您將能夠看到更新查詢以及發生了什麼。

+0

嗨@XiCoN JFS, 感謝您的回答,它的正常工作,當我檢查了近20至50條記錄,但某些情況下,它的失敗。 當我觀察日誌語句時,有正確的參數來更新時間戳值。 雅,我使用的唯一更新的實體。 –

+0

我個人從未遇到過這樣的問題。你如何編輯你的'merge'函數來評估返回值。如果它不是期望的值,則創建一個對象的'System.out.println(obj)'。通過這種方式,您可以更仔細地瞭解實際發生的時間。你也可以考慮在項目中查找編輯過的字段的任何用法(getters和實際字段),看看是否真的沒有任何操作這個字段的值。 –