In addition to template class, Artemis has the Repository. This interface helps the Entity repository to save, update, delete and retrieve information.
To use Repository, just need to create a new interface that extends the Repository .
Copy interface PersonRepository extends Repository<Person, String> {
}
The qualifier is mandatory to define the database type that will be used at the injection point moment.
Copy @Inject
@Database(DatabaseType.DOCUMENT)
private PersonRepository documentRepository;
@Inject
@Database(DatabaseType.COLUMN)
private PersonRepository columnRepository;
And then, as the repository class, create either a ColumnFamilyManager or a DocumentCollectionManager with produces method:
Copy @Produces
public DocumentCollectionManager getManager() {
DocumentCollectionManager manager = //instance
return manager;
}
@Produces
public ColumnFamilyManager getManager() {
ColumnFamilyManager manager = //instance
return manager;
}
To work with multiple database you can use qualifiers:
Copy @Inject
@Database(value = DatabaseType.DOCUMENT , provider = "databaseA")
private PersonRepository documentRepositoryA;
@Inject
@Database(value = DatabaseType.DOCUMENT , provider = "databaseB")
private PersonRepository documentRepositoryB;
@Inject
@Database(value = DatabaseType.COLUMN, provider = "databaseA")
private PersonRepository columnRepositoryA;
@Inject
@Database(value = DatabaseType.COLUMN, provider = "databaseB")
private PersonRepository columnRepositoryB;
//producers methods
@Produces
@Database(value = DatabaseType.COLUMN, provider = "databaseA")
public ColumnFamilyManager getColumnFamilyManagerA() {
ColumnFamilyManager manager =//instance
return manager;
}
@Produces
@Database(value = DatabaseType.COLUMN, provider = "databaseB")
public ColumnFamilyManager getColumnFamilyManagerB() {
ColumnFamilyManager manager = //instance
return manager;
}
@Produces
@Database(value = DatabaseType.DOCUMENT, provider = "databaseA")
public DocumentCollectionManager getDocumentCollectionManagerA() {
DocumentCollectionManager manager = //instance
return manager;
}
@Produces
@Database(value = DatabaseType.DOCUMENT, provider = "databaseB")
public DocumentCollectionManager DocumentCollectionManagerB() {
DocumentCollectionManager manager = //instance
return manager;
}
So, Artemis will inject automatically.
Copy PersonRepository repository = //instance
Person person = new Person();
person.setNickname("diana");
person.setName("Diana Goodness");
List<Person> people = Collections.singletonList(person);
repository.save(person);
repository.save(people);
Search information from Repository
The Repository also has a method query from the method name. These are the keywords:
findBy : The prefix to find some information
deleteBy : The prefix to delete some information
Also the operators:
Copy interface PersonRepository extends Repository<Person, Long> {
List<Person> findByAddress(String address);
Stream<Person> findByName(String name);
Stream<Person> findByNameOrderByNameAsc(String name);
Optional<Person> findByNickname(String nickname);
void deleteByNickName(String nickname);
}
Using these keywords, Artemis will create the queries.
Using Repository as asynchronous way
The RepositoryAsync interface works similarly as Repository but with asynchronous work.
Copy @Inject
@Database(DatabaseType.DOCUMENT)
private PersonRepositoryAsync documentRepositoryAsync;
@Inject
@Database(DatabaseType.COLUMN)
private PersonRepositoryAsync columnRepositoryAsync;
In other words, just inject and then create an Entity Manager async with producers method.
Copy PersonRepositoryAsync repositoryAsync = //instance
Person person = new Person();
person.setNickname("diana");
person.setName("Diana Goodness");
List<Person> people = Collections.singletonList(person);
repositoryAsync.save(person);
repositoryAsync.save(people);
Also, delete and retrieve information with a callback.
Copy interface PersonRepositoryAsync extends RepositoryAsync<Person, Long> {
void findByNickname(String nickname, Consumer<List<Person>> callback);
void deleteByNickName(String nickname);
void deleteByNickName(String nickname, Consumer<Void> callback);
}
Repository at KeyValue
Key-value database has support to Repository .
Copy public interface UserRepository extends Repository<User, String> {
}
And inject the resource.
Copy @Inject
private UserRepository userRepository;
Then use a producer to BucketManager
Copy @Produces
public BucketManager getManager() {
BucketManager manager =//instance
return manager;
}
You can use qualifier when you want to use a different database in the same application.
Copy @Inject
@Database(value = DatabaseType.KEY_VALUE, provider = "databaseA")
private UserRepository userRepositoryA;
@Inject
@Database(value = DatabaseType.KEY_VALUE, provider = "databaseB")
private UserRepository userRepositoryB;
//producers methods
@Produces
@Database(value = DatabaseType.KEY_VALUE, provider = "databaseA")
public BucketManager getManager() {
BucketManager manager =//instance
return manager;
}
@Produces
@Database(value = DatabaseType.KEY_VALUE, provider = "databaseB")
public BucketManager getManagerB() {
BucketManager manager = //instance
return manager;
}
Once there is not another to both delete and find information, there isn't dynamic query.
Copy UserRepository userRepository = //instance
User user = new User("ada", "Ada Lovelace", 30);
List<User> users = Collections.singletonList(user);
userRepository.save(user);
userRepository.save(users);
Optional<User> userOptional = userRepository.findById("ada");
Iterable<User> usersFound = userRepository.findById(Collections.singletonList("ada"));
In the key-value resource, the Repository does not support method query resource.