Я работаю с Spring Boot и Amazon DynamoDB с использованием библиотеки this. Проблема с этой иерархии классов:Amazon DynamoDB и иерархия классов
@DynamoDBTable(tableName = "EventLogs")
abstract class AbstractEventLogEntry implements Serializable {
private static final long serialVersionUID = 7713867887326010287L;
@DynamoDBHashKey(attributeName = "EventId")
private String eventId;
@DynamoDBAttribute(attributeName = "GeneratedAt")
@DynamoDBMarshalling(marshallerClass = ZonedDateTimeMarshaller.class)
private ZonedDateTime generatedAt;
AbstractEventLogEntry() {
eventId = new UUID().value();
generatedAt = ZonedDateTime.now();
}
/* Getters/Setter */
}
... другой класс:
public abstract class EventLogEntry extends AbstractEventLogEntry {
private static final long serialVersionUID = 1638093418868197192L;
@DynamoDBAttribute(attributeName = "UserId")
private String userId;
@DynamoDBAttribute(attributeName = "EventName")
private String eventName;
protected EventLogEntry(AdminEvent event) {
userId = event.getUserName();
eventName = event.getClass().getSimpleName();
}
protected EventLogEntry(UserEvent event) {
userId = event.getUserId();
eventName = event.getClass().getSimpleName();
}
/* Getters/Setter */
}
... еще один:
public class AdminEventLogEntry extends EventLogEntry {
private static final long serialVersionUID = 1953428576998278984L;
public AdminEventLogEntry(AdminEvent event) {
super(event);
}
}
... и последнее:
public class UserEventLogEntry extends EventLogEntry {
private static final long serialVersionUID = 6845335344191463717L;
public UserEventLogEntry(UserEvent event) {
super(event);
}
}
Типичная иерархия классов. Теперь я пытаюсь сохранить AdminEventLogEntry
и UserEventLogEntry
с использованием общего хранилища:
@EnableScan
public interface EventLogEntryRepository extends DynamoDBCrudRepository<EventLogEntry, String> {
// ...
}
... и он всегда говорит мне:
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: no key(s) present on class io.shido.events.domain.AdminEventLogEntry
Как только я объявляю (снова) ключ это работает :
@DynamoDBHashKey(attributeName = "EventId")
private String eventId;
Итак, мой вопрос: мне нужно повторно объявить все поля, которые могут быть общими между иерархиями? Похоже, что он не узнает HashKey
от родителя.
Любые подсказки?
вы нашли решение для этого? –
Да! И он работает довольно круто (до сих пор). Я отправлю его. –