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.