Repository
Last updated
Last updated
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.
interface PersonRepository extends Repository<Person, String> {
}
The qualifier is mandatory to define the database type that will be used at the injection point moment.
@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:
@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:
@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.
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);
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:
And
Or
Between
LessThan
GreaterThan
LessThanEqual
GreaterThanEqual
Like
OrderBy
OrderBy____Desc
OrderBy_____ASC
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.
The RepositoryAsync interface works similarly as Repository but with asynchronous work.
@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.
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.
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);
}
Key-value database has support to Repository.
public interface UserRepository extends Repository<User, String> {
}
And inject the resource.
@Inject
private UserRepository userRepository;
Then use a producer to BucketManager
@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.
@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.
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.