Недавно я узнал об объявлении для аудита и смог успешно использовать его для отслеживания изменений и получения их с помощью аннотации @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);
Если бы я хотел изменить рецепт, чтобы сказать, например, 375F вместо 400F, это создает 2-й пересмотр CookieRecipe
, который является то, что я ожидал и хочу. Однако я хочу, чтобы пакет, который я уже создал, указывал на ревизию 1 CookieRecipe
. В настоящее время, если я получаю CookieBatch
, я уже создал его идентификатор, ссылка на CookieRecipe
заканчивается последней версией (с 375F).
Это что-то, что я могу выполнить с помощью envers?
'CookieBatch' не является' @ Audited' намеренно? Если это так, я не думаю, что есть элегантный способ сделать то, что вы пытаетесь сделать. – SergeiBednar
@SergeiBednar Да, только причина заключается в том, что после завершения «CookieBatch» он не изменяется.Поэтому я подумал, что это необязательно, так как это просто создаст таблицу аудита, которая никогда не будет использоваться ... если я не понял это поведение. Я не против добавления в него '@ Audited', если это приведет к решению. – cklab
Я думаю, что ваше единственное другое решение здесь - сохранить значения 'recipeId' и' recipeRevisionNumber', изменить сущность 'recipe' в вашей' CookieBatch' на '@ Transient' и обрабатывать запрос рецепта самостоятельно, через envers 'AuditCriteria', после загрузки объекта' CookieBatch'. – SergeiBednar