Os “maestros” da persistência é dividida em forma síncrona e assíncrona com Repository e RepositoryAsync respectivamente. Esses recursos serão estendidos principalmente para adicionar recursos que existem especificamente em cada driver do diana, por exemplo, live query no OrientDB ou nível de consistência no Cassandra. Com o intuito de facilitar essa extensão existem as seguintes classes:
AbstractKeyValueRepository
AbstractColumnRepository
AbstractColumnRepositoryAsync
AbstractDocumentRepository
AbstractDocumentRepositoryAsync
Para exemplificar, será criado uma extensão do ColumnRepository para suportar alguns recursos específicos que tem apenas no Cassandra: O Cassandra Query Language e a persistência com nível de consistência.
publicclassCassandraColumnRepositoryextendsAbstractColumnRepository { @InjectprivateColumnEntityConverter converter; @InjectprivateCassandraColumnFamilyManager manager; @InjectprivateColumnWorkflow workflow; @InjectprivateColumnEventPersistManager eventManager; @OverrideprotectedColumnEntityConvertergetConverter() {return converter; } @OverrideprotectedColumnFamilyManagergetManager() {return manager; } @OverrideprotectedColumnWorkflowgetFlow() {return workflow; } @OverrideprotectedColumnEventPersistManagergetEventManager() {return eventManager; }public <T> Tsave(T entity,ConsistencyLevel level) {Objects.requireNonNull(entity,"entity is required");Objects.requireNonNull(level,"level is required");UnaryOperator<ColumnEntity> save = e ->manager.save(e, level);returnworkflow.flow(entity, save); }public <T> Tsave(T entity,Duration ttl,ConsistencyLevel level) throwsNullPointerException {Objects.requireNonNull(entity,"entity is required");Objects.requireNonNull(level,"level is required");UnaryOperator<ColumnEntity> save = e ->manager.save(e, ttl, level);returnworkflow.flow(entity, save); }public <T> List<T> cql(String query) throwsNullPointerException {Objects.requireNonNull(query,"query is required");List<ColumnEntity> entities =manager.cql(query);returnentities.stream().map(converter::toEntity).map(c -> (T) c).collect(Collectors.toList()); }publicvoiddelete(ColumnDeleteQuery query,ConsistencyLevel level) throwsNullPointerException {manager.delete(query, level); }}
Assim, herdando a classe AbstractColumnRepository o CassandraColumnRepository terá suporte a todos os recursos já existentes na API do Artemis e pode adicionar os recursos específicos do Cassandra.