具有更改日志和数据库同步的实体

时间:2012-07-29 10:07:59

标签: java jpa locking synchronisation

我正在寻找一个基于java,jpa2,spring,hibernate数据库应用程序的解决方案,它允许我基本上像实体的SCM那样做。我有一个数据库驱动的java企业应用程序,托管在多个应用程序服务器上。这些应用程序服务器托管无状态Web应用程序(REST API等),这些应用程序都基于相同的Java代码并使用相同的数据库。此应用程序提供的一项服务是文件管理。用户(通过各种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。为此,我需要某种简单的方法来检索“head”版本(这将是版本集合中的最后一个条目)。基本上File上的每个写操作都需要根据当时的“头”创建一个新的FileVersion。鉴于多个应用程序服务器访问同一个数据库,我不确定是否有某种方法可以锁定相应的File实体(行级锁定?),以便我确定基于我的新文件版本在右边“头”。

我的另一个想法是让客户端提供他的更改所基于的某种版本标识符。如果在持久化时此版本标识符与给定FileVersion的最新File不匹配,则应用程序必须拒绝更改...

我是否朝着正确的方向前进,或者我的方法被视为失败?

1 个答案:

答案 0 :(得分:1)

我会有一个表只有“head”值(就像普通表)和第二个表有一个所有更改的日志。这将允许您获得任何以前的版本。您可以创建触发器来更新日志表或使用Java进行。