Guide de l'ORM Ebean
1. introduction
Ebean est un outil de mappage objet-relationnel écrit en Java.
Il prend en charge les annotations JPA standard pour la déclaration d'entités. Cependant, il fournit une API beaucoup plus simple pour la persistance. En fait, l'un des points à noter à propos de l'architecture Ebean est qu'elle est sans session, ce qui signifie qu'elle ne gère pas entièrement les entités.
En plus de cela, il est également livré avec une API de requête et prend en charge l'écriture de requêtes en SQL natif. Ebean prend en charge tous les principaux fournisseurs de bases de données tels que Oracle, Postgres, MySql, H2, etc.
Dans ce didacticiel, nous allons voir comment nous pouvons créer, conserver et interroger des entités à l'aide d'Ebean et H2.
2. Installer
Pour commencer, voyons nos dépendances ainsi qu'une configuration de base.
2.1. Dépendances Maven
Avant de commencer, importons les dépendances requises:
io.ebean
ebean
11.22.4
com.h2database
h2
1.4.196
ch.qos.logback
logback-classic
1.2.3
2.2. Améliorations
Ebean doit modifier les beans entité afin qu'ils puissent être gérés par le serveur. Ainsi, nous allons ajouter un plugin Maven pour faire ce travail:
io.ebean
ebean-maven-plugin
11.11.2
main
process-classes
debug=1
enhance
Nous devons également fournir au plug-in Maven les noms des packages contenant les entités et les classes qui utilisent des transactions. Pour ce faire, nous créons le fichierebean.mf:
entity-packages: com.example.ebean.model
transactional-packages: com.example.ebean.app
2.3. Enregistrement
Créons égalementlogback.xml et définissons les niveaux de journalisation de certains packages surTRACE afin que nous puissions voir les instructions en cours d'exécution:
3. Configurer un serveur
Nous devons créer une instanceEbeanServer pour enregistrer des entités ou exécuter des requêtes sur une base de données. Il existe deux manières de créer une instance de serveur: utiliser un fichier de propriétés par défaut ou le faire par programme.
3.1. Utilisation d'un fichier de propriétés par défaut
Le fichier de propriétés par défaut peut être de typeproperties ouyaml. Ebean recherchera la configuration dans les fichiers avec les nomsapplication.properties,ebean.properties ouapplication.yml.
Outre la fourniture des détails de connexion à la base de données, nous pouvons également demander à Ebean de créer et d'exécuter des instructions DDL.
Voyons maintenant un exemple de configuration:
ebean.db.ddl.generate=true
ebean.db.ddl.run=true
datasource.db.username=sa
datasource.db.password=
datasource.db.databaseUrl=jdbc:h2:mem:customer
datasource.db.databaseDriver=org.h2.Driver
3.2. Utilisation de ServerConfig
Voyons ensuite comment nous pouvons créer le même serveur par programmation en utilisantEbeanServerFactory etServerConfig:
ServerConfig cfg = new ServerConfig();
Properties properties = new Properties();
properties.put("ebean.db.ddl.generate", "true");
properties.put("ebean.db.ddl.run", "true");
properties.put("datasource.db.username", "sa");
properties.put("datasource.db.password", "");
properties.put("datasource.db.databaseUrl","jdbc:h2:mem:app2";
properties.put("datasource.db.databaseDriver", "org.h2.Driver");
cfg.loadFromProperties(properties);
EbeanServer server = EbeanServerFactory.create(cfg);
3.3. Instance de serveur par défaut
A single EbeanServer instance maps to a single database. En fonction de nos besoins, nous pourrions également créer plus d'une instance deEbeanServer.
Si une seule instance de serveur est créée, elle est enregistrée par défaut en tant qu'instance de serveur par défaut. Il est accessible n'importe où dans l'application en utilisant une méthode statique sur la classeEbean:
EbeanServer server = Ebean.getDefaultServer();
S'il y a plusieurs bases de données, il est possible d'enregistrer l'une des instances de serveur comme instance par défaut:
cfg.setDefaultServer(true);
4. Création d'entités
Ebean fournit un support complet pour les annotations JPA ainsi que des fonctionnalités supplémentaires en utilisant ses propres annotations.
Créons quelques entités à l'aide d'annotations JPA et Ebean. Tout d'abord, nous allons créer unBaseModel qui contient des propriétés communes aux entités:
@MappedSuperclass
public abstract class BaseModel {
@Id
protected long id;
@Version
protected long version;
@WhenCreated
protected Instant createdOn;
@WhenModified
protected Instant modifiedOn;
// getters and setters
}
Ici, nous avons utilisé l'annotation JPAMappedSuperClass pour définir les annotationsBaseModel. et deux annotations Ebeanio.ebean.annotation.WhenCreated etio.ebean.annotation.WhenModified à des fins d'audit.
Ensuite, nous allons créer deux entitésCustomer etAddress qui étendentBaseModel:
@Entity
public class Customer extends BaseModel {
public Customer(String name, Address address) {
super();
this.name = name;
this.address = address;
}
private String name;
@OneToOne(cascade = CascadeType.ALL)
Address address;
// getters and setters
}
@Entity
public class Address extends BaseModel{
public Address(String addressLine1, String addressLine2, String city) {
super();
this.addressLine1 = addressLine1;
this.addressLine2 = addressLine2;
this.city = city;
}
private String addressLine1;
private String addressLine2;
private String city;
// getters and setters
}
DansCustomer, nous avons défini un mappage un à un avecAddress et ajouté un type de cascade défini àALL afin que les entités enfants soient également mises à jour avec les entités parentes.
5. Opérations CRUD de base
Nous avons vu précédemment comment configurer lesEbeanServer et créer deux entités. Maintenant,let’s carry out some basic CRUD operations dessus.
Nous utiliserons l'instance de serveur par défaut pour conserver et accéder aux données. La classeEbean fournit également des méthodes statiques pour conserver et accéder aux données qui transmettent la demande à l'instance de serveur par défaut:
Address a1 = new Address("5, Wide Street", null, "New York");
Customer c1 = new Customer("John Wide", a1);
EbeanServer server = Ebean.getDefaultServer();
server.save(c1);
c1.setName("Jane Wide");
c1.setAddress(null);
server.save(c1);
Customer foundC1 = Ebean.find(Customer.class, c1.getId());
Ebean.delete(foundC1);
Tout d'abord, nous créons un objetCustomer et avons utilisé l'instance de serveur par défaut pour le sauvegarder en utilisantsave().
Ensuite, nous mettons à jour les détails du client et les enregistrons à nouveau à l'aide desave().
Enfin, nous utilisons la méthode statiquefind() surEbean pour récupérer le client et le supprimer à l'aide dedelete().
6. Des requêtes
Query APIs can also be used to create an object graph with filters and predicates. Nous pouvons utiliserEbean ouEbeanServer pour créer et exécuter des requêtes.
Examinons une requête qui trouve unCustomer par ville et renvoie un sobjectCustomer etAddress avec seulement quelques champs renseignés:
Customer customer = Ebean.find(Customer.class)
.select("name")
.fetch("address", "city")
.where()
.eq("city", "San Jose")
.findOne();
Ici, avecfind() nous indiquons que nous voulons trouver des entités de typeCustomer. Ensuite, nous utilisonsselect() pour spécifier les propriétés à remplir dans l'objetCustomer.
Plus tard, nous utilisonsfetch() pour indiquer que nous voulons récupérer l'objetAddress appartenant auxCustomer et que nous voulons récupérer le champcity.
Enfin, nous ajoutons un prédicat et limitons la taille du résultat à 1.
7. Transactions
Ebean exécute chaque instruction ou requête dans une nouvelle transaction par défaut.
Bien que cela puisse ne pas être un problème dans certains cas. Il peut arriver que nous souhaitions exécuter un ensemble d'instructions dans une seule transaction.
Dans de tels cas, si nous annotons la méthode avecio.ebean.annotations.Transactional, all, les instructions de la méthode seront exécutées dans la même transaction:
@Transactional
public static void insertAndDeleteInsideTransaction() {
Customer c1 = getCustomer();
EbeanServer server = Ebean.getDefaultServer();
server.save(c1);
Customer foundC1 = server.find(Customer.class, c1.getId());
server.delete(foundC1);
}
8. Construire le projet
Enfin, nous pouvons construire le projet Maven en utilisant la commande:
compile io.ebean:ebean-maven-plugin:enhance
9. Conclusion
Pour résumer, nous avons examiné les fonctionnalités de base d'Ebean qui peuvent être utilisées pour conserver et interroger des entités dans une base de données relationnelle.
Enfin, ce code est disponible surGithub.