2017-03-16 60 views
0

前進的感謝。的EclipseLink歷史addEndFieldName

我在使用Eclipselink歷史記錄時遇到問題。 addEndFieldName總是變爲空。 addStartFieldName具有正確的時間戳。它適用於插入和更新。當實體被刪除時,歷史表中沒有條目。

請幫我,我與掙扎安靜一段時間

這裏是我的代碼:

import org.eclipse.persistence.annotations.Customizer; 

private static final long serialVersionUID = 1L; 
@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "id_product") 
private Integer idProduct; 

..... 

和DescriptorCustomizer是

public class TrackHistoryCustomizer implements DescriptorCustomizer { 

    @Override 
    public void customize(ClassDescriptor descriptor) { 
     HistoryPolicy policy = new HistoryPolicy(); 
     policy.addHistoryTableName(descriptor.getTableName(), descriptor.getTableName() + "_history"); 
     policy.addStartFieldName("start_date"); 
     policy.addEndFieldName("end_date"); 
     policy.setShouldHandleWrites(true); 
     descriptor.setHistoryPolicy(policy); 
    } 
} 

這裏是我的歷史表

的輸出

id_product起始日期END_DATE 30 2017年3月14日17:19:53.000 「」 30 2017年3月14日17:27:16.000 「」 30 2017年3月14日17:31:32.000 「」

end_date字段始終爲空。刪除操作也不會被插入到表中。

我無法理解它爲什麼會發生。我錯過了什麼嗎?謝謝。

+0

空ENDFIELD似乎表明的最新變化。您的歷史記錄表僅顯示一個ID字段 - ID不可修改,因此記錄的歷史記錄方式不會太多。你如何去除實體? – Chris

+0

我已將id字段和start_date字段作爲歷史記錄表的主鍵。我通過entityManager.remove方法刪除 –

+0

打開日誌並運行一個簡單的測試。堅持一個新的實體在一個事務和提交,然後之後刪除它在其他交易,並顯示日誌的EclipseLink生成 - 它應該記錄它嘗試使用SQL並可能給你的,爲什麼沒有一個歷史記錄條目指示刪除。 – Chris

回答

0

歷史記錄表的工作原理是當你持續一個新的實體時,一行進入歷史表,顯示這個數據的開始日期,但沒有結束日期,因爲數據仍然存在。當你改變某些東西時,以前的歷史記錄行會得到一個結束日期,並且會放入一個新條目以反映當前狀態。當前狀態總是有一個空的結束日期,因爲它仍然是活動的。這使您可以審覈更改,並在下次更新之前查看每次更改的時間以及它們的存在時間。

當您刪除一行時,以前的歷史記錄行只會得到一個結束日期。那麼歷史記錄表中應該沒有行代表被刪除的具有空結束日期的實體,因爲沒有當前的數據。

+0

非常感謝克里斯。歷史表需要一個主鍵,如果我用auto_increment放置一個長ID,歷史策略仍然知道要更新哪些行。 –

+0

我不是一個DBA,但什麼是添加一個自動遞增的ID字段,如果它不使用任何的意義呢?從技術上講,該行有一個ID - 實體ID和開始日期 – Chris

+0

這意味着我必須在歷史記錄表中添加一個列的行ID。如果eclipselink可以即時創建歷史記錄表,那將非常棒。我瞭解暫時沒有。我的歷史記錄表包含具有start_date和end_date的實體的確切鏡像副本。我可能無法確定歷史記錄表的主鍵。非常感謝克里斯。 –