2016-07-04 2 views
-1

Данного кода:HowTo карта Javers снимок для объекта с помощью JPA аннотаций/конвертера

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 обратно в объект объекта Application для списка объектов истории?

Я не нашел то, что искал в Google. Только поток, говорящий, что в будущем будет возможно получить объект из моментального снимка. Для такого простого объекта, который я использую, это можно сделать, как показано выше. Но как его можно включить в код, так что моментальные снимки могут использоваться как запись истории.

Javers хранит новый снимок для каждой сохраненной смены объекта в базе данных в собственной таблице. Поле состояния/столбец кодируется json Gson (внутренне). Таким образом, использование Gson для преобразования его в объект можно сделать следующим образом. Эта концепция работает, но не автоматически. Можете ли вы, пожалуйста, помочь мне включить javers в качестве встроенного механизма истории в свой код?

Разумеется, изменения в классе сущностей, а также в классе преобразователей приветствуются, но история должна выполняться с помощью снимков javers, а не заново изобретать колесо, вводя новый объект с историческим состоянием и обрабатывая его как отдельную сущность.

+0

AttributeConverter предназначен для преобразования из значения поля в значение хранилища данных. Поле является переходным, поэтому нет понятия ценности хранилища данных, поэтому он не будет использоваться. –

+0

@NeilStockton: Как я уже сказал, вы можете предложить смену данного кода. Я знаю, что в его нынешнем состоянии это не работает, но в этом весь смысл этого форума, чтобы помочь дать ответы. – termil0r

+0

Я просто объясняю, ПОЧЕМУ это не работает. Я бы подумал, что это добавит к вашим знаниям ... –

ответ

0

Восстановление исходных объектов домена из CdoSnapshots еще не реализовано в JaVers. Есть некоторые планы по этому поводу - https://github.com/javers/javers/issues/133

+0

У меня уже есть мой конвертер, который будет конвертировать моментальные снимки в объекты домена, но мне просто нужен способ его выполнения. Вопрос только в том, как это сделать. – termil0r

 Смежные вопросы

  • Нет связанных вопросов^_^