这是我的场景。我有一个父表 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/