这是我的情景。我有一个父表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设计它。
我编写了我的Entity和Repository类,并且保存方法似乎独立工作。但我不知道如何同时进行latest_version
更新。
可以使用JPA / Hibernate完成吗?或者它应该是数据库触发器吗?
答案 0 :(得分:1)
触发器是一个有效选项,但可以使用JPA / Hibernate完成。
我建议在@PrePersist
实体定义的某个方法上使用files_versions
注释...当执行:EntityManager.persist(FileVersion);
时,JPA将调用此方法,它可以是用于更新实体的衍生属性...在您的情况下,将是文件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();
}
}