Недавно я узнал о envers для аудита и смог успешно использовать его для отслеживания изменений и получения их с помощью аннотации @Audited
и AuditReader
. Теперь то, что я пытаюсь достичь, - это сохранить сопоставления с проверяемой сущностью в той ревизии, в которой они были сделаны, вместо самой последней ревизии.
Быстрый пример:
Допустим, у меня есть рецепт для файлов cookie, который я использую для создания пакетов файлов cookie (псевдоклассы для классов ниже). У каждого рецепта есть список инструкций, которым нужно следовать, и при этом создается партия:
@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);
И я буду использовать этот рецепт для создания своей первой партии файлов cookie:
CookieBatch batch = new CookieBatch(recipe);
entityManager.persist(batch);
Если бы я хотел изменить рецепт, чтобы сказать, например, 375F вместо 400F, это создаст ревизию 2 CookieRecipe
, чего я ожидаю и хочу. Однако я хочу, чтобы уже созданная мною партия указывала на ревизию 1 файла CookieRecipe
. В настоящее время, если я извлекаю CookieBatch
, который я уже создал, используя его идентификатор, ссылка на CookieRecipe
оказывается последней ревизией (с 375F).
Могу ли я этого добиться с помощью envers?
CookieBatch
не быть@Audited
намеренно? Если так, то я не верю, что есть элегантный способ делать то, что вы пытаетесь сделать. - person SergeiBednar   schedule 04.10.2016CookieBatch
он не меняется. Поэтому я решил, что в этом нет необходимости, поскольку это просто создаст таблицу аудита, которая никогда не будет использоваться на самом деле ... если я не пойму это поведение неправильно. Я не против добавления к нему@Audited
, если это приведет к решению. - person cklab   schedule 04.10.2016recipeId
иrecipeRevisionNumber
, изменить сущностьrecipe
в вашемCookieBatch
на@Transient
и самостоятельно обрабатывать запросы рецепта через enversAuditCriteria
после загрузки сущностиCookieBatch
. - person SergeiBednar   schedule 04.10.2016recipeRevisionNumber
во время сохраненияCookieBatch
? - person cklab   schedule 06.10.2016CookieRecipe
должен быть сохранен, и вы можете получить последнюю версию с помощью критериев аудита. Ознакомьтесь с этой документацией, она довольно солидная: docs.jboss.org/envers/docs - person SergeiBednar   schedule 06.10.2016