2016-07-29 13 views
0

Dies ist mein Szenario. Ich habe eine Elterntabelle Files_Info und eine Kindtabelle Files_Versions.JPA/Hibernate: Aktualisieren Sie den Wert der übergeordneten Spalte, bevor Sie den Wert der untergeordneten Spalte einfügen

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) 
); 

Dies ist hauptsächlich eine Datei und ihre verschiedenen Versionen zu verfolgen. Wenn der Benutzer eine neue Dateierstellung initiiert (noch keine Version der Datei hochgeladen), wird ein Eintrag in die Tabelle files_info mit grundlegenden Informationen wie Name, Beschreibung vorgenommen. Die neuste Version wird anfangs 0 sein.

Dann, wenn der Benutzer die erste Version hochgeladen wurde, wird ein Eintrag in der files_versions Tabelle für die file_id erstellt wird und die Version Wert wird als Eltern gesetzt latest_version + 1. Eltern latest_version wird nun auf 1 gesetzt

Die Der Benutzer kann auch eine erste Version der Datei hochladen, wenn er eine neue Dateierstellung initiiert. In diesem Fall wird der übergeordnete Datensatz mit der neusten Version als 1 und auch dem entsprechenden untergeordneten Datensatz der Version 1 erstellt.

Ich weiß nicht, wie dies mit JPA/Hibernate zu entwerfen.

Ich schrieb meine Entity und Repository-Klassen und die Speichermethoden scheinen unabhängig voneinander zu arbeiten. Aber ich weiß nicht, wie man gleichzeitig die latest_version Updates macht.

Kann dies mit JPA/Hibernate geschehen? Oder sollte es ein Datenbanktrigger sein?

Antwort

1

Ein Trigger ist eine gültige Option, aber es kann mit JPA/Hibernate durchgeführt werden.

Ich werde @PrePersist Anmerkung auf irgendeine Weise an der files_versions Einheit definiert, verwenden vorschlagen ... Diese Methode wird von JPA aufgerufen werden, wenn Sie ausführen: EntityManager.persist(FileVersion); und es kann Gebrauch zu aktualisieren Unternehmens Derivat Attribut sein ... In Ihrem Fall, wird die Summe der Datei last_version + 1 sein ... Beispiel:

@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

Vielen Dank für den Vorschlag. Ich denke, dass PrePersist funktionieren sollte. Ich habe bereits eine Methode mit PrePersist kommentiert, wo ich den letzten modifizierten Zeitstempel aktualisieren. Es hat mich nicht getroffen. – Gnana