私は、java、jpa2、spring、hibernateデータベースアプリケーションに照らして、基本的にエンティティのSCMのようなことを実行できるソリューションを探しています。複数のアプリケーションサーバーでホストされているデータベース駆動型のJavaエンタープライズアプリケーションがあります。これらのアプリケーションサーバーは、すべて同じJavaコードに基づいており、同じデータベースを使用するステートレスWebアプリケーション(REST APIなど)をホストします。このアプリケーションが提供するサービスの1つは、ファイル管理です。ユーザーは(さまざまな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
エンティティをロックできる方法があるかどうかはわかりません(行レベルのロック?)。これにより、新しいファイルバージョンを正しい「頭」に基づいて作成できます。 "。
私が持っていたもう1つの考えは、クライアントに、変更の基になっているある種のバージョン識別子を提供させることでした。FileVersion
永続化時にこのバージョン識別子が特定のバージョンの最新のものと一致しない場合File
、アプリケーションは変更を拒否する必要があります...
私はこれで正しい方向に進んでいますか、それとも私のアプローチは失敗したと見なされますか?