-1

给定代码:

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 获取的快照转换回应用程序实体对象以获取历史对象列表?

我在谷歌上没有找到我要找的东西。只有一个线程说将来可以从快照中获取对象。对于我正在使用的这种简单对象,可以按照上面介绍的方式完成。但是如何将其合并到代码中,以便将快照用作历史记录。

Javers 将实体的每个保存更改的新快照存储到其自己的表中的数据库中。状态字段/列由 Gson(内部)编码为 json。因此使用 Gson 将其转换回实体可以如下完成。这个概念有效,但不是自动的。您能帮我将 javers 作为开箱即用的历史机制合并到我的代码中吗?

当然,欢迎对实体类和转换器类进行更改,但历史必须由 javers 快照完成,而不是通过引入具有历史状态的新实体并将其作为单独的实体处理来重新发明轮子。

4

1 回答 1

0

从 CdoSnapshots 恢复原始域对象尚未在 JaVers 中实现。对此有一些计划 - https://github.com/javers/javers/issues/133

于 2016-07-05T06:37:30.870 回答