2016-07-04 6 views
-1

考えるコード: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を使ってエンティティに変換するには、次のようにします。この概念は機能しますが、自動的には機能しません。あなたはジャバを私のコードに組み込み直しの歴史的仕組みとして組み込むのを助けてくれますか?

もちろん、エンティティクラスとコンバータークラスの変更は歓迎しますが、ヒストリ状態の新しいエンティティを導入してホイールを再作成する代わりにジャバースナップショットで履歴を作成し、別のエンティティとして処理する必要があります。

+0

AttributeConverterは、フィールド値からデータストア値に変換することです。フィールドは一時的なものなので、データストアの値の概念はないため、使用されません。 –

+0

@NeilStockton:私が言ったように、あなたは与えられたコードの変更を提案することができます。私は、現在の状態では動作しませんが、それは答えを出すのを助けるこのフォーラムの全体のポイントであることを認識しています。 – termil0r

+0

私はそれがうまくいかない理由を単に説明しています。私はあなたの知識を増やすと思っていたでしょう... –

答えて

0

CdoSnapshotsからの元のドメインオブジェクトの復元は、まだJaVersでは実装されていません。これに関するいくつかの計画があります - https://github.com/javers/javers/issues/133

+0

私は既にスナップショットをドメインオブジェクトに変換する私のコンバータを持っていますが、それを実行する方法が必要です。問題は、これを行う方法です。 – termil0r