概要

ドラフト可能は、オブジェクトグラフの「ライブ」バージョンとは別に「ドラフト」バージョンを保持するために、2番目のテーブルセットを使用する機能です。通常、ドラフトオブジェクトは編集され、公開される前に承認プロセスを経ます。

この機能を実装するために、すべての@Draftableおよび@DraftElement Beanは、ライブテーブルによく似た2番目のドラフトテーブルを持っていますが、通常、公開の承認ワークフローをサポートするための追加の列があります。

公開は、ドラフトテーブルから基礎となる行を取得し、それらを一致するライブテーブルにコピーする機能です。このようにして、アプリケーションはエンティティの「ドラフト」バージョンと「ライブ」バージョンを簡単に維持できます。

マッピング


エンティティマッピング

@Draftable

@Draftableは、ドラフト可能機能をサポートする必要があるエンティティBeanに付与されるアノテーションです。

@Draftableアノテーションは「トップレベル」(またはルートレベル)のエンティティBeanに付与され、@DraftableElementは同じグラフの一部と見なされる関連する子エンティティBeanに付与されます。

@DraftableBeanを公開すると、関連する子@DraftableElement Beanとともに、「トップレベル」の@DraftableエンティティBeanが公開されます。

@DraftableElement

@DraftableElementは、ドラフト可能なオブジェクトグラフの一部であるものの、「トップレベル」のBeanではないエンティティBeanに付与されるアノテーションです。publish()およびdraftRestore()関数は、ドラフト可能Beanとその関連するすべてのドラフト可能Element Beanに対して、単一のユニットとして(ユニットとして公開/復元)機能します。


プロパティマッピング

@DraftOnly

@DraftOnlyは、ドラフトテーブルにのみ存在するプロパティに付与されるアノテーションです。これらのプロパティは、関連するライブテーブルには存在しません。たとえば、承認ワークフロー(ワークフローステータス、公開タイムスタンプなど)をサポートするためにドラフトにあるアノテーションプロパティなどです。

@DraftDirty

@DraftDirtyは、@DraftableエンティティBeanのbooleanプロパティに付与できるアノテーションです。このプロパティはドラフトテーブルにのみ存在し、ドラフトBeanが保存されると自動的にtrueに設定され、ドラフトBeanが公開されると自動的にfalseに設定されます。このプロパティは、公開する必要のあるドラフトBeanを識別(クエリ)するために使用されることが期待されます。

現在、@DraftableElementへの変更は、'所有' @Draftable Beanのダーティフラグを設定せず、代わりに、必要な場合はこのケースで手動で行う必要があります。

@DraftReset

@DraftResetは、@DraftableエンティティBeanのプロパティに付与できるアノテーションです。このプロパティの値は、公開後にドラフトBeanで自動的にnullに設定されます。たとえば、プロパティには、承認ワークフローに関連するコメントまたはタイムスタンプ値が含まれる可能性があります(Beanが公開された後、これらはドラフトBeanでnullに「リセット」されます)。

ドラフトとしてクエリ

通常のクエリは、「ライブ」テーブルからオブジェクトグラフを構築します。クエリをasDraft()を実行するように指定すると、ドラフトテーブルを使用してオブジェクトグラフが構築されます。これは、オブジェクトグラフの現在編集中の状態をプレビューするために使用できます。

// Get the 'draft' object graph
Document documentDraft =
    Ebean.find(Document.class)
      .setId(docId)
      .asDraft()
      .findOne();


// Get the 'draft' documents
List<Document> draftDocuments =
    Ebean.find(Document.class)
      .where()
        .eq("dirty", true)
        .ge("whenPublish", now)
      .asDraft()
      .findList();

注:asDraftクエリ状態は、遅延ロードまたはクエリ結合に伝播されます。

注:asDraftクエリは、L2キャッシュを使用しません(ライブBeanのクエリのみがL2キャッシュを使用できます)。

公開

公開は、ドラフトオブジェクトグラフの値を取得し、それらを一致するライブオブジェクトグラフに適用する関数です。公開関数は、トップレベルの@DraftableエンティティBeanから、関連する@DraftableElementエンティティBeanにカスケードします。

@OneToMany

@DraftableElementへの@OneToMany関係は、事実上、保存と削除のカスケードが自動的にオンになっています。カスケードの保存/削除は、内部でオブジェクトグラフを公開するために使用されます。

@ManyToMany

@DraftableBeanへの@ManyToMany関係は、事実上、関係を維持するために保存と削除のカスケードが自動的にオンになっています。

Database database = DB.getDefault();

// publish a single bean (from draft to live)
// returning the 'live' bean
Document liveDoc = database.publish(Document.class, docId);


// publish using a query
Query<Link> pubQuery = database.find(Link.class)
  .where().idIn(ids)
  .order().asc("id");

// publish returning the resulting 'live' beans
List<Link> pubList = database.publish(pubQuery);

ドラフトの復元

ドラフトの復元は、ライブオブジェクトグラフの値を取得し、それらを一致するドラフトオブジェクトグラフに適用する関数です。これは、公開の反対と考えることができます。

Database database = DB.getDefault();

// Restore a single draft bean
database.draftRestore(Document.class, docId);


Query<Document> restoreQuery = database.find(Document.class)
  .where().idIn(ids)
  .order().asc("id");

// Restore all the beans matching a query
database.draftRestore(restoreQuery);

アプリケーション例

アプリケーション例は、example-draftableで入手できます。

L2キャッシュ

ライブBeanとクエリのみがL2キャッシュを使用できます。同様に、ライブBeanの保存/削除のみがL2キャッシュの一部を無効にします。ドラフトBeanのすべてのクエリはL2キャッシュを使用せず、ドラフトBeanの保存/削除はL2キャッシュのどの部分も無効にしません。