2016-07-29 9 views
0

これは私のシナリオです。私は親テーブルFiles_Infoと子テーブルFiles_Versionsを持っています。JPA/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になります。

そして、ユーザが最初のバージョンをアップロードしたときに、エントリがそのFILE_IDためfiles_versionsテーブル内に作成され、親のlatest_version + 1親のがlatest_versionは現在1

に設定されているように、バージョン 値が設定されていますユーザーは、新しいファイル作成を開始したときにファイルの初期バージョンをアップロードすることもできます。その場合、親レコード はlatest_versionを1として作成し、対応するバージョン1の子レコードも作成します。

JPA/Hibernateを使用してこれを設計する方法はわかりません。

エンティティとリポジトリのクラスを作成しました。保存メソッドは独立して動作するようです。しかし、私は同時にlatest_versionアップデートを行う方法がわかりません。

これはJPA/Hibernateを使用して行うことができますか?それともデータベースのトリガーですか?

答えて

1

トリガーは有効なオプションですが、JPA/Hibernateを使用して実行できます。

私はあなたが実行したときに、この方法は、JPAによって呼び出されます... files_versionsエンティティで定義されたいくつかの方法で@PrePersistアノテーションを使用することをお勧めます:EntityManager.persist(FileVersion);と、エンティティの派生属性を更新するために使用することができます...あなたは例:

@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

関連する問題