JPA / Hibernate:在插入子列值之前更新Parent列值

时间:2016-07-29 21:16:50

标签: 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设计它。

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

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

1 个答案:

答案 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();
    }
}