2012-07-29 48 views
0

我正在尋找一個解決方案,根據java,jpa2,spring,hibernate數據庫應用程序,這些應用程序允許我基本上爲SCM實體做一些事情。我有一個託管在多個應用程序服務器上的數據庫驅動的Java企業應用程序。這些應用程序服務器承載所有基於相同Java代碼並使用相同數據庫的無狀態Web應用程序(REST API等)。此應用程序提供的一項服務是文件管理。用戶(通過各種API客戶端和前端應用程序)能夠創建(上傳),刪除,重命名,移動文件和文件夾。實體與更改日誌和數據庫同步

現在已經有一段時間文件版本的需求出現了,最後我想解決這個問題。這是我想出了在Java中的實體方面:

public class File { 

    private String id; 
    private ReadableInstant created; 

    private List<FileVersion> versions; 

} 

public class FileVersion { 

    private String name; 
    private FileVersion parent; 
    private List<FileVersion> children; 
    private ReadableInstant modified; 
    private FileOperation operation; 

} 

public enum FileOperation { 

    CREATE, 
    RENAME, 
    UPDATE, 
    DELETE 

} 

我打算通過代表團揭露File,而不是直接FileVersion。爲了這個工作,我需要一些簡單的方法來檢索「頭」版本(這將是版本集合中的最後一個條目)。基本上,File上的每個寫入操作都需要基於當前的「磁頭」創建新的FileVersion。鑑於多個應用程序服務器訪問同一個數據庫,我不確定是否有某種方式可以鎖定相應的File實體(行級鎖定?),以便我確定將我的新File版本放在正確的「頭」。

我想過的另一個想法是讓客戶端提供他的更改所基於的某種版本標識符。如果在持續這個版本標識符不匹配最新的FileVersion對於給定的File,應用程序將不得不拒絕更改...

我正在朝着正確的方向,或者是我的方法被視爲失敗?

回答

1

我會有一個只有「頭」值(這就像普通表)和第二個表中有所有變化的日記表。這將允許你獲得任何以前的版本。您可以創建觸發器來更新日記表或使用Java進行。

+0

對不起,不接受你的答案。我完全忘記了這個問題。與此同時,我提出的解決方案與您提出的建議沒有太大差別。我現在擁有普通的File對象,每個對象都有一個FileHistoryEntry集合。這些條目可以被解釋爲恢復較舊的File版本,但它不像完全成熟的SCM類系統那樣複雜。 – aeisele 2013-01-14 19:52:13