Code Gegeben:HowTo Karte Javers Snapshot Einheit über JPA Annotationen/Konverter
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();
}
}
Wie JPA meinen Konverter machen verwendet Snapshot aus Javers für die Liste der Geschichte Objekte zurück zur Anwendungs Entitätsobjekt bekamen zu konvertieren?
Ich habe nicht gefunden, was ich auf Google suche. Nur ein Thread, der sagt, dass es in Zukunft möglich sein wird, ein Objekt von einem Snapshot zu bekommen. Für solch ein einfaches Objekt, das ich benutze, kann es wie oben dargestellt gemacht werden. Aber wie kann es in den Code integriert werden, so dass Snapshots als History-Eintrag verwendet werden können.
Javers speichert einen neuen Snapshot für jede gespeicherte Änderung der Entität in der Datenbank in einer eigenen Tabelle. Das Statusfeld/die Spalte wird von Gson (intern) nach json codiert. Die Verwendung von Gson zur Konvertierung in Entity kann also folgendermaßen erfolgen. Dieses Konzept funktioniert aber nicht automatisch. Kannst du mir bitte dabei helfen, Javer als Out-of-the-Box-History-Mechanismus in meinen Code einzubauen?
Natürlich sind Änderungen an Entity-Klasse und Converter-Klasse willkommen, aber die Geschichte muss von Javers-Snapshots gemacht werden, anstatt das Rad neu zu erfinden, indem neue Entity mit History-State eingeführt und als separate Entity verarbeitet wird.
Ein AttributeConverter konvertiert einen Feldwert in einen Datenspeicherwert. Das Feld ist vorübergehend, daher gibt es kein Konzept des Datenspeicherwerts, daher wird es nicht verwendet. –
@NeilStockton: Wie ich schon sagte, können Sie die Änderung des angegebenen Codes vorschlagen. Ich bin mir bewusst, dass es in seinem aktuellen Zustand nicht funktioniert, aber das ist der Sinn dieses Forums, um Antworten zu geben. – termil0r
Ich erkläre einfach, WARUM es nicht funktioniert. Ich hätte gedacht, dass das zu deinem Wissen beiträgt ... –