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

标签 java jpa locking synchronization

我正在寻找一个针对 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

}

我计划通过委托(delegate)直接公开 File 而不是 FileVersion。为此,我需要某种简单的方法来检索“头”版本(这将是版本集合中的最后一个条目)。基本上,File 上的每个写入操作都需要基于当前的“head”创建一个新的FileVersion。鉴于多个应用程序服务器访问同一数据库,我不确定是否有某种方法可以锁定相应的 File 实体(行级锁定?),以便我确定基于我的新文件版本位于右侧“头部”。

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

我的方向是正确的还是我的方法被认为是失败的?

最佳答案

我将有一个表,其中仅包含“头”值(就像普通表一样),第二个表包含所有更改的日志。这也将允许您获得任何以前的版本。您可以创建触发器来更新日志表或在 Java 中执行此操作。

关于java - 具有更改日志和数据库同步的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708374/

相关文章:

java - JProfiler - "Run GC"按钮与堆快照的 "Perform full GC in heap snapshot"选项

C# - Lock 适合在库中的什么地方使用?

c++ - 使用 C++ lock_guard 时如何收紧范围?

java - 前端 JBoss 的安全问题 - OWASP 安全性的模糊性

java - 如何使用 lambda 表示法创建具有初始容量和自定义比较器的优先级队列?

java - Spring Test MockMvc 对外部 URL 执行请求

JPA 1.0 @OrderBy 使用字段名称与 JPA 2.0 @OrderColumn 使用列名称

java - 是否有将 PostgreSQL hstore 转换为 JPA 2.1 DataType 的优雅且通用的方法?

hibernate - 为什么带有@EmbeddedId的实体不能在对应的@Embeddable类中使用LocalDateTime?

java - 同步方法中的重入