2011-12-02 35 views
3

所以我有三個字段類映射到使用表休眠需要知道,如果每場發生了變化,我應該如何在Hibernate中模擬這種

Class Widget 
{ 
    String field1; 
    String field2; 
    String field3; 
} 

在應用程序啓動一些情況下,這些小部件將從外部文件添加到數據庫中,但是當我退出應用程序時,我需要知道應用程序啓動後用戶更改了哪些(如果有)這些字段,因此可以將更改保存迴文件。爲了記錄目的,我還需要存儲原始值。

我無法工作,無論我是否需要表中的狀態字段,或者是否已有一種使用Hibernate/Database的方法。

編輯:一個很好的解決方案如下。然而我使用Hibernate的主要原因是爲了減少內存消耗,所以當更改時存儲原始值對我來說不是一個好的解決方案,我想要存儲在數據庫中的everthing。所以,我有。如果你正在使用MySQL,那麼你可以從INFORMATION_SCHEMA數據庫表的最後更新時間像

SELECT UPDATE_TIME FROM `information_schema`.`tables` 
      WHERE TABLE_SCHEMA = 'dbName' AND TABLE_NAME = 'tableName' 

否則簡單的解決方案將是添加一列用於更新時間戳創造這個新的問題How do I store a copy of each entity I add to database in Hibernate

回答

4

給定一個像下面這樣的實體,你可以跟蹤其中一個域的變化(同時保留它的原始值)。

@Entity 
@Table(schema = "test", name = "test") 
public final class Test { 

    private static final int ORIGINAL = 0; 
    private static final int CURRENT = 1; 

    private Integer id; 

    // holds the original and current state of the field 
    private final AtomicReferenceArray<String> field = new AtomicReferenceArray<>(2); 

    @Id 
    public Integer getId() { 
    return id; 
    } 

    public void setId(Integer id) { 
    this.id = id; 
    } 

    @Transient 
    public String getOriginalField() { 
    return field.get(ORIGINAL); 
    } 

    @Basic 
    public String getField() { 
    return field.get(CURRENT); 
    } 

    public void setField(String field) { 
    this.field.compareAndSet(ORIGINAL, null, field); 
    this.field.set(CURRENT, field); 
    } 

    @PreUpdate 
    public void preUpdate() { 
    System.out.format("Original: %s, New: %s\n", getOriginalField(), getField()); 
    } 

    ... 

}

如果有一個單列在數據庫這樣的:

 id: 1 
    field: a 
version: 2011-12-02 11:24:00 

得到更新之前(比如,從ab),你會得到以下輸出。

Original: d, New: b 

的原始值被保留下來,即使在實體更新多次,雙方狀態可通過相應的獲取方法(getfield命令訪問getOriginalField - 您就可以在命名獲得更多的創造性比我:)。

通過這種方式,您可以不必在數據庫中創建版本列,也可以隱藏客戶端的實現細節。

而不是AtomicReferenceArray你可以使用數組,列表等來跟蹤所有這些變化。

​​當然不是必需的,但這樣可以通知您實體狀態的變化並自動將更新的字段保存到文件中。還有更多註釋如下:請參閱javax.persistence其他註釋類型的文檔。

+0

說,我剛讀了關於版本,它似乎是擬optmistic併發控制,不是我試着這樣做,是這項工作的正確工具。我還想知道哪些領域發生了變化,不僅僅是物質變化了。 –

+0

好吧,我想在我的情況下,它將使最有意義只需添加一個狀態字段爲每個字段 –

+0

「我想knwo哪些字段改變了」你沒有在你的問題表明這一點。不過,在我讀完其他評論後,我也回答了你的後一個問題。無論如何,如果你想知道你的實體的'field1'在一個特定的時間跨度已經改變或沒有,那麼你必須有在該區間的極端一個實體的狀態的*快照*(它的起點和終點*點*) 。 –

0

。通過這個,你甚至可以監視哪一行更新了。

+0

所以我需要對每個場的狀態的話,我不只是想知道,如果事情已經chnaged我想知道發生了什麼變化 –

+0

@ user294896如果你想知道具體的行那麼據我所知,你一定需要一個updateTimeStamp(狀態)在db中的列。 –

0

如果你需要使用的文件,只要你保存到數據庫同步,您可以使用Hibernate事件機制來攔截任何保存到數據庫並保存到文件,這裏有一個sample這樣做。

+0

謝謝,但這不是我想要做的。我想在一些點,這是已被修改的所有窗口小部件,而這些部件的whihc領域已經改變 –

相關問題