最近エンベロープに関するエンバブを見つけて、@Audited
アノテーションとAuditReader
を使用してリビジョンを追跡し、フェッチすることができました。さて、私が達成しようとしているのは、最新のリビジョンの代わりに行われたリビジョンで監査されたエンティティへのマッピングを保持することです。JPAアノテーションを使用してエンティティの古いリビジョンにマッピングする
クイック例:
のは、私は(下記のクラスの疑似クラス)クッキーのバッチを作るために使用するクッキーのレシピを持っているとしましょう。各レシピには従うべき命令のリストを持っているし、そうすることはバッチを作成します。
@Audited
@Table(name="recipes")
class CookieRecipe {
@OneToMany(mappedBy="recipe")
private List<RecipeStep> steps;
private void addStep(String instruction) {
steps.add(new RecipeStep(instruction));
}
}
@Table(name="batches")
class CookieBatch {
@ManyToOne
@JoinColumn(...)
private CookieRecipe recipe;
}
@Audited
@Table(name="recipe_step")
class RecipeStep {
@Column
private String instruction;
@ManyToOne
@JoinColumn(...)
private CookieRecipe recipe;
private RecipeStep(String instruction) {
this.instruction = instruction;
}
}
さて、私はこのクッキーのレシピ持っているとしましょう:
CookieRecipe recipe = new CookieRecipe();
recipe.addStep("Make the dough");
recipe.addStep("Place on pan");
recipe.addStep("Bake at 400F for 20 minutes");
entityManager.persist(recipe);
を私は作成するためにこのレシピを使用することがありますクッキーの私の最初のバッチ:
CookieBatch batch = new CookieBatch(recipe);
entityManager.persist(batch);
私は例えば、言うためにレシピを変更したい場合は、代わりに400Fの375°Fが、これは私が期待して欲しいものである、CookieRecipe
のリビジョン2を作成します。しかし、すでに作成したバッチがCookieRecipe
のリビジョン1を指すようにしたいと思います。現在、IDを使用してすでに作成したCookieBatch
を取得した場合、CookieRecipe
への参照は最新のリビジョン(375Fのもの)になります。
これは私がenversを使用して達成できるものですか?
'CookieBatch'はされていません' @監査された 'は意図的ですか?もしそうなら、私はあなたがやろうとしていることをやり遂げる優雅な方法があるとは思わない。 – SergeiBednar
@SergeiBednarはい、「CookieBatch」が完了しても変更されないという理由だけです。だから私はそれが本当に使用されることはない監査テーブルを作成するので不必要だと思った...私はこの動作を誤解しない限り。私はそれが解決策につながるなら、それに '@ Audited'を追加することに反対していません。 – cklab
あなたの唯一の解決策は、 'recipeId'と' recipeRevisionNumber'の値を保持し、 'CookieBatch'の' recipe'エンティティを '@ Transient'に変更し、あなた自身がレシピのクエリを処理することです'AuditCriteria'、あなたが' CookieBatch'エンティティをロードした後。 – SergeiBednar