2016-07-29 90 views
0

這是我的場景。我有一個父表Files_Info和一個子表Files_VersionsJPA/Hibernate:在插入子列值之前更新父列值

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完成嗎?或者它應該是一個數據庫觸發器?

回答

1

觸發器是一個有效的選項,但它可以使用JPA/Hibernate完成。

我會建議使用上的files_versions實體定義的一些方法@PrePersist註釋...此方法將由JPA被稱爲當你執行:EntityManager.persist(FileVersion);,它可以使用更新實體的衍生屬性...在你的case,將文件的總和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(); 
    } 
} 
+0

感謝您的建議。我認爲PrePersist應該工作。我已經有了一個用PrePersist註釋的方法,我更新了最後修改的時間戳。它並沒有爲我着想。 – Gnana