Java 如何通过JPA注释/转换器将Javers快照映射到实体
给定代码:Java 如何通过JPA注释/转换器将Javers快照映射到实体,java,spring,jpa,converter,javers,Java,Spring,Jpa,Converter,Javers,给定代码: public enum ApplicationStatus { CREATED, VERIFIED, APPROVED, REJECTED, DELETED, PUBLISHED; } @lombok.Data // adds constructors, getters, setters, equals & hashcode @Table("Application") public class Application implements Serializable
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();
}
}
公共枚举应用程序状态{
创建、验证、批准、拒绝、删除、发布;
}
@lombok.Data//添加构造函数、getter、setter、equals和hashcode
@表(“申请”)
公共类应用程序实现可序列化{
@Id@GeneratedValue
私人长id;
@枚举(EnumType.STRING)
私有应用程序状态;
@短暂的
@转换器(HistoryConverter.class)
私有列表应用历史;
}
@存储库
@JaversSpringDataAuditable
公共接口应用程序存储库扩展了分页和排序存储库{}
@组成部分
@转换器
公共类HistoryConverter实现AttributeConverter{
@自动连线
私人标枪;
@凌驾
公共列表convertToDatabaseColumn(应用程序实体){
列表快照=javers.findSnapshots(QueryBuilder.byInstanceId(entity.getId(),Application.class).build())
返回snapshots.stream().map(s->convertToEntity(s.getState()).collect(Collectors.toList());
}
私有应用程序convertToEntity(CdoSnapshot快照){
JsonConverter gson=javers.getJsonConverter();
字符串json=gson.toJson(state);
返回gson.fromJson(json,Application.class);
}
@凌驾
公共应用程序convertToEntityAttribute(列表dbData){
抛出新的UnsupportedOperationException();
}
}
如何让JPA使用我的转换器将从javers获取的快照转换回历史对象列表的应用程序实体对象
我没有在谷歌上找到我要找的东西。只有一个线程表示将来可以从快照中获取对象。对于这样简单的对象,我使用它可以如上所示。但是如何将其合并到代码中,以便快照可以用作历史记录条目
Javers将实体每次保存的更改的新快照存储到数据库中自己的表中。状态字段/列由Gson(内部)编码为json。因此,使用Gson将其转换回实体可以如下所示。这一概念起作用,但不是自动的。你能帮我把javers作为开箱即用的历史机制合并到我的代码中吗
当然,对实体类和转换器类的更改是受欢迎的,但历史必须由javers快照完成,而不是通过引入具有历史状态的新实体并将其作为独立实体处理来重新发明轮子。在javers中还没有实现从CdoSnapshots恢复原始域对象。对此有一些计划-AttributeConverter将从字段值转换为数据存储值。字段是暂时的,因此没有数据存储值的概念,因此不会使用它。@NeilStockton:正如我所说,您可以建议更改给定代码。我知道在它目前的状态下它不起作用,但这就是这个论坛帮助给出答案的全部目的。我只是解释为什么它不起作用。我本以为这会增加你的知识…@NeilStockton:那么,请接受我的道歉。我已经有了将快照转换为域对象的转换器,但我只需要一种方法来执行它。问题是如何做到这一点。