与えられたコード:
public enum ApplicationStatus {
CREATED, VERIFIED, APPROVED, REJECTED, DELETED, PUBLISHED;
}
@lombok.Data // adds constructors, getters, setters, equals & hashcode
@Table("Application")
public class Application implements Serializable {
@Id @GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private ApplicationStatus status;
@Transient
@Converter(HistoryConverter.class)
private List<Application> applicationHistory;
}
@Repository
@JaversSpringDataAuditable
public interface ApplicationRepository extends PagingAndSortingRepository<Application, Long> {}
@Component
@Converter
public class HistoryConverter implements AttributeConverter<Application, List<Application>> {
@Autowired
private Javers javers;
@Override
public List<Application> convertToDatabaseColumn(Application entity) {
List<CdoSnapshot> snapshots = javers.findSnapshots(QueryBuilder.byInstanceId(entity.getId(), Application.class).build())
return snapshots.stream().map(s -> convertToEntity(s.getState())).collect(Collectors.toList());
}
private Application convertToEntity(CdoSnapshot snapshot) {
JsonConverter gson = javers.getJsonConverter();
String json = gson.toJson(state);
return gson.fromJson(json, Application.class);
}
@Override
public Application convertToEntityAttribute(List<Application> dbData) {
throw new UnsupportedOperationException();
}
}
JPAにコンバーターを使用させて、javersから取得したスナップショットを履歴オブジェクトのリストのアプリケーションエンティティオブジェクトに変換する方法は?
Google で探しているものが見つかりませんでした。将来スナップショットからオブジェクトを取得できるようになると言っているスレッドのみ。私が使用しているこのような単純なオブジェクトの場合、上記のように実行できます。しかし、スナップショットを履歴エントリとして使用できるように、コードに組み込む方法.
Javars は、エンティティの保存されたすべての変更の新しいスナップショットを独自のテーブルのデータベースに保存します。状態フィールド/列は、Gson によって (内部で) json にエンコードされます。したがって、Gson を使用してエンティティに戻すには、次のようにします。この概念は機能しますが、自動的には機能しません。javas をすぐに使える履歴メカニズムとしてコードに組み込むのを手伝ってくれませんか?
もちろん、エンティティ クラスとコンバーター クラスの変更は大歓迎ですが、履歴は、履歴状態を持つ新しいエンティティを導入して別のエンティティとして処理することによって車輪を再発明するのではなく、javas スナップショットによって行う必要があります。