java - JPA/hibernate : Update Parent column value before inserting child column value

标签 java postgresql hibernate jpa

这是我的场景。我有一个父表 Files_Info 和一个子表 Files_Versions

create table files_info(
   id bigint primary key, 
   name varchar(255) not null, 
   description varchar(255) not null, 
   last_modified TIMESTAMP, 
   latest_version integer default 0 not null
);

create table files_versions(
   id bigint primary key,
   file_id bigint references files_info(id), 
   version integer not null, 
   location text not null, 
   created TIMESTAMP, 
   unique(file_id, version)
);

这主要是为了跟踪一个文件及其各个版本。当用户启动新文件创建(尚未上传文件的任何版本)时,会在 files_info 表中创建一个条目,其中包含名称、描述等基本信息。 latest_version 最初将为 0。

然后,当用户上传第一个版本时,会在 files_versions 表中为该 file_id 和版本创建一个条目 值设置为父级的 latest_version + 1。父级的 latest_version 现在设置为 1。

用户还可以在启动新文件创建时上传文件的初始版本。在这种情况下,家长记录 将使用latest_version 为1 以及相应的版本1 子记录来创建。

我不知道如何使用 JPA/Hibernate 来设计它。

我编写了实体和存储库类,并且保存方法似乎独立工作。但我不知道如何同时进行 latest_version 更新。

这可以使用 JPA/Hibernate 来完成吗?或者应该是数据库触发器?

最佳答案

触发器是一个有效的选项,但它可以使用 JPA/Hibernate 来完成。

我建议在 files_versions 实体中定义的某些方法上使用 @PrePersist 注释...当您执行以下命令时,JPA 将调用此方法:EntityManager.persist(FileVersion); 它可用于更新实体的派生属性...在您的情况下,将是文件last_version + 1 的总和...示例:

@Entity
@Table(name = "files_info")
public class FileInfo {
}

@Entity
@Table(name = files_versions)
public class FileVersion {
    ... //some attributes
    @Column(name = "version")
    private int version;

    @ManyToOne
    @JoinColumn(name = "file_id")
    private FileInfo fileInfo;

    ... //some getters and setters

    @PrePersist
    private void setupVersion() {
        // fileInfo should be set before of calling persist()!
        // fileInfo should increase its lastest Version before of calling persist()!
        this.version = this.fileInfo.getLastVersion();
    }
}

关于java - JPA/hibernate : Update Parent column value before inserting child column value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667621/

相关文章:

PostgreSQL:表示以下 Oracle SQL 的等效方式,HH.MI.SSXFF AM

hibernate - JPA 条件查询,上课顺序

参数化类的java单例

java - 数组练习困惑

postgresql - 对表格的每 3 行求和

PostgreSQL - 如何获取先前(滞后)的计算值

java - SOAP 字段始终返回 null 作为值

java - 套接字的输入字节流包装在两种不同的流类型中?

java - @NonNull 注释允许在验证中使用空值

java - 使用Spring hibernate mongodb进行审计