考えるコード:JPAは、スナップショットを変換するために私のコンバータを使用するようにする方法ハウツーマップJaversスナップショット/ Aコンバータ
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();
}
}
は、履歴オブジェクトのリストのために戻って、アプリケーションエンティティオブジェクトへのjaversからもらいましたか?
私はgoogleで探していたものが見つかりませんでした。スナップショットからオブジェクトを取得することが将来可能であることを示すスレッドのみ。私はそれを使用しているそのような単純なオブジェクトのために上記のように行うことができます。しかし、どのようにコードに組み込むことができるので、スナップショットは履歴エントリとして使用できます。
Javersは、保存されたすべての変更のための新しいスナップショットを、独自のテーブルにデータベースに格納します。状態フィールド/列はGsonによってjsonに(内部的に)エンコードされます。 Gsonを使ってエンティティに変換するには、次のようにします。この概念は機能しますが、自動的には機能しません。あなたはジャバを私のコードに組み込み直しの歴史的仕組みとして組み込むのを助けてくれますか?
もちろん、エンティティクラスとコンバータークラスの変更は歓迎しますが、ヒストリ状態の新しいエンティティを導入してホイールを再作成する代わりにジャバースナップショットで履歴を作成し、別のエンティティとして処理する必要があります。
AttributeConverterは、フィールド値からデータストア値に変換することです。フィールドは一時的なものなので、データストアの値の概念はないため、使用されません。 –
@NeilStockton:私が言ったように、あなたは与えられたコードの変更を提案することができます。私は、現在の状態では動作しませんが、それは答えを出すのを助けるこのフォーラムの全体のポイントであることを認識しています。 – termil0r
私はそれがうまくいかない理由を単に説明しています。私はあなたの知識を増やすと思っていたでしょう... –