2017-04-06 67 views
0

我正在處理應用程序,它具有一個名爲My.java的實體,它從具有稱爲編輯的字段的另一個實體擴展。 此字段將使用當前時間戳更新,每次更新是否有可能更新實體與外面的調用者被調用jpa

我正在使用單表繼承策略。

我使用jpa/eclipse鏈接作爲持久性提供者。

編輯的字段正在使用當前時間戳進行更新,即使在調用setter方法的情況下,我的java代碼中也沒有其他引用更改此編輯字段的值。

在調試時,我可以看到UPDATE QL語句,用於編輯的字段更新。

我真的想知道爲什麼/它是如何更新值,它可能與出二傳手調用?

這裏是映射的超類:

@MappedSuperclass 

public abstract class SuperEntity implements Serializable {  

/** 
* 
*/ 
private static final long serialVersionUID = 1125783654888232605L; 
/** 
* The time the entry was created 
*/ 
@Column(name = "CREATED") 
private Timestamp created; 
/** 
* The date the entry was edited 
*/ 
@Column(name = "EDITED") 
@Version 
private Timestamp edited; 
+0

它可以使用註釋克服它很容易。實體中的「編輯」字段是否有註釋?例如'@ UpdateTimestamp'。或者在實體中是否有任何方法具有諸如'@ PrePersist'之類的註釋?發佈你的實體類將有所幫助。 –

+0

已發佈java類 –

回答

1

檢查這些東西。

  1. 你的實體可實施某種審計接口
  2. 你的字段可以有@版本註解

在第一種情況下,你必須弄明白該接口的使用,你可以把它理解 在第二種情況是EJB和Hibernate中的默認和預期行爲。

我有google搜索您

https://technology.amis.nl/2006/01/03/ejb-30-persistence-using-the-version-annotation-for-optimistic-locking-in-the-glassfish-reference-implementation/

這不是一個很大的擔心的事情可能是有用後這個鏈接,你可以

1

是。 JPA實現不需要一些屬性偵聽器或代理來檢測您的類是否通過setter更新了值。他們如何檢測對託管實例的更改可能取決於實現,但支持通過直接訪問而不是getter/setter更新到字段。例如,可以保留通過持久性管理器獲得的實例的副本,並且在完成事務或發出提交時,可能已對其進行更改的被管實例與原始數據進行比較,並將更新發布爲必要。

事實上,可以明確地指定了如何訪問一個實體類將被執行,通過這樣的註解:https://docs.oracle.com/javaee/7/api/javax/persistence/Access.html

Conversly,有可能是未通過現場支持的特性,而是有一個計算價值的吸氣劑。使用屬性訪問時,這些也會導致在從代碼創建數據庫時生成列,並在持久化或合併實體時插入/更新值。

所以簡而言之,只是調用setter並不是在託管實體中將屬性或持久字段標記爲「髒」。如果您可以直接訪問某個字段並對其進行更改,那麼也會導致更新。

1

帶有@Version註釋的字段將由休眠自動控制,並用於其optimistic locking功能。

因此,當您保存實體時,Hibernate本身會自動設置該字段。

+0

建議您在答案中用EclipseLink替換Hibernate,因爲他說「我正在使用EclipseLink」 –

相關問題