Я хотел пойти дальше и ответить на свой вопрос:
Чтобы воспользоваться преимуществами Lombok для обработки стандартного кода, а также обеспечить, чтобы все совокупные корни следовали одному и тому же соглашению для атрибутов ID и аудита:
Я решил использовать интерфейс:
@Document
public interface PersistentDocument extends Serializable {
void setId(String id);
String getId();
@CreatedDate
@ReadOnlyProperty
void setCreatedTimestamp(LocalDateTime timestamp);
LocalDateTime getCreatedTimestamp();
@LastModifiedDate
void setLastModifiedTimestamp(LocalDateTime timestamp);
LocalDateTime getLastModifiedTimestamp();
@Version
void setVersion(Long version);
Long getVersion();
}
Действительно приятная, но тонкая вещь в интерфейсе состоит в том, что аннотации данных пружины могут применяться к интерфейсу, а не к моделям. Это не полностью удаляет аннотации из моделей (вам все равно нужно аннотировать поля модели, например, с помощью индексов).
Объекты модели просто определяют свойства и используют Ломбок:
@Data
@Builder
public class UnitOfMeasure implements PersistentDocument {
private static final long serialVersionUID = 1L;
private String id;
@Indexed(unique=true)
private String code;
private String name;
private String description;
//Audit Columns
private LocalDateTime createdTimestamp;
private LocalDateTime lastModifiedTimestamp;
private Long version;
}
Чтобы разрешить очистку постоянных идентификаторов пустой строки / пробела:
Мне удалось расширить SimpleMongoRepository с помощью моей собственной реализации:
public class PersistentDocumentMongoRepository<T extends PersistentDocument> extends SimpleMongoRepository <T, String> {
public PersistentDocumentMongoRepository(MongoEntityInformation<T, String> metadata, MongoOperations mongoOperations) {
super(metadata, mongoOperations);
}
@Override
public <S extends T> S save(S entity) {
sanitizeId(entity);
return super.save(entity);
}
@Override
public <S extends T> List<S> saveAll(Iterable<S> entities) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
Streamable.of(entities).stream().forEach(this::sanitizeId);
return super.saveAll(entities);
}
@Override
public <S extends T> S insert(S entity) {
sanitizeId(entity);
return super.insert(entity);
}
@Override
public <S extends T> List<S> insert(Iterable<S> entities) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
Streamable.of(entities).stream().forEach(this::sanitizeId);
return super.insert(entities);
}
private void sanitizeId(T entity) {
if (!StringUtils.hasText(entity.getId())) {
entity.setId(null);
}
}
}
И, наконец, говорю Spring Data использовать реализацию пользовательского репозитория с:
@EnableMongoAuditing
@EnableMongoRepositories(repositoryBaseClass=PersistentDocumentMongoRepository.class)
Надеюсь, это поможет другим, и мне бы очень хотелось посмотреть, как другие решают подобные проблемы.