Я использую Envers со Spring и ищу способ установить sh связь @OneToOne с определенной версией объекта.
Для простоты предположим, что у меня есть две сущности ...
@Entity
@Table
public class Orchestration {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
private Workflow workflow;
// ...
}
@Entity
@Table
public class Workflow {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// ...
}
При сохранении я хотел бы, чтобы workflow
отражал данные во время создания, а не самые последние. например, если я сохраню экземпляр Orchestration
, то через некоторое время имя рабочего процесса изменится, этот экземпляр должен по-прежнему иметь старое имя.
Пока что я добавил private Integer rev;
в Orchestration
, чтобы сохранить номер редакции во время создания из revinfo и сделал Workflow
@Transient
, поэтому я не втягиваю автоматически обычный объект. Затем я добавил пользовательские запросы к OrchestrationRespoitory
, например
@Query(value = "" +
"select * from orchestration o " +
"left join workflow_aud wa on o.workflow_id = wa.id " +
"and wa.rev <= o.rev and (wa.revend > o.rev OR wa.revend IS NULL) " +
"where wa.name = :workflowName",
nativeQuery = true)
List<Orchestration> findAllByWorkflowName(@Param("workflowName") String workflowName);
Это работает нормально, но мне нужно вручную заполнить workflow
после этого, используя ...
var result = auditReader().createQuery()
.forEntitiesAtRevision(Workflow.class, orchestration.getRev())
.add(AuditEntity.id().eq(orchestration.getWorkflowId()))
.getSingleResult();
orchestration.setWorkflow((Workflow) result);
Что я надеюсь, что это способ удалить это @Transient
и иметь workflow
, отражающую версию, указанную rev
, с прокси-геттерами и всеми другими магами c: D
Любые идеи, советы или мысли был бы очень признателен.