| Astuce | ||
|---|---|---|
| ||
Relecture RB |
Sommaire :
| Sommaire | ||
|---|---|---|
|
...
esup-commons préconise le développement en couches :
Accès aux données
Pour pouvoir avoir accès à l'objet Entry User donné en exemple au paragraphe précédent la couche métier doit disposer de méthodes dans l'interface DaoService.
Cela se traduira, par Dans notre exemple, par deux méthodes permettant, d'une part, d'ajouter une Entry en base de donnée et, d'autre part de récupérer les objets Entry depuis la base de données :
| Bloc de code |
|---|
void addEntry(Entry entry);
List<Entry> getEntries();
|
Ces deux méthodes de l'interface doivent se retrouver dans son implémentation concrète (par exemple HibernateDaoService).
Service métier
Ensuite, ce sont les contrôleurs qui vont avoir besoin de dialoguer avec la couche métier.A nouveau, nous allons passer par une interface (DomainService) qui, par exemple, définira ces deux méthodes :
| Bloc de code |
|---|
Entry addEntry(String value)
List<Entry> getEntries()
|
Ces deux méthodes seront implémentées dans une classe concrète (par exemple DomainServiceImpl).
| Info |
|---|
Ici la couche métier n'apporte pas beaucoup de service. Typiquement, la méthode addEntry() prend en paramètre une chaînes de caractères, crée une instance de la classe Entry, (new Entry()) lui donne la valeur passée en paramètre et la date courante puis la passe à la couche de persistance (la date courante sera obtenue grâce à new Timestamp(System.currentTimeMillis())). |
...
Écrire les méthodes ci-dessus dans les classes ad hoc.
| solution | ||||||||
|---|---|---|---|---|---|---|---|---|
Ajouter à l'interface DaoService :
Ajouter dans la classe HibernateDaoServiceImpl:
Ajouter à l'interface DomainService :
Ajouter dans la classe DomainServiceImpl:
|
...
c'est la classe JPADaoServiceImpl, implémentant l'interface DaoService qui permet de manipuler les entités via les mécanismes de JPA.
Typiquement une telle classe va proposer des méthodes pour rechercher, ajouter, supprimer et modifier des objets.
Pour ce faire JPADaoServiceImpl a besoin d'un gestionnaire d'entité (EntityManager). Ce dernier est simplement obtenu grâce à une annotation :
| Bloc de code |
|---|
@PersistenceContext
public void setEntityManager(EntityManager em) {
this.entityManager = em;
} |
Ensuite la propriété entityManager de la classe JPADaoServiceImpl est utilisable pour manipuler les objets.
Recherche
| Bloc de code |
|---|
Query q = entityManager.createQuery("SELECT user FROM User user");
List<User> users = (List<User>)q.getResultList(); |
Ici on utilise le languege EJB QL. Cf. paragraphe suivant.
Ajout
| Bloc de code |
|---|
entityManager.persist(user); |
Suppression
| Bloc de code |
|---|
User tmp = entityManager.find(User.class, user.getId());
entityManager.remove(tmp); |
Ici on recherche l'objet avant de le supprimer. C'est une bonne pratique car JPA (Comme Hibernate) utilise une notion de session de persistance. Cette dernière est créée et fermée à chaque requête. Pour pouvoir manipuler correctement les objets il faut qu'ils soient rattachés à la session de persistance. Le fait de faire une recherche préalable permet de le garantir. Si l'objet était déjà rattaché à la session cette recherche n'aurait aucun impact sur la base de données.
Mise à jour
| Bloc de code |
|---|
User user2 = entityManager.merge(user); |
Ici merge permet de mettre à jour l'objet en base de données. L'objet passé en paramètre peut être déjà rattaché à la session de persistance ou non. L'objet qui est renvoyé est une copie de l'objet passé en paramètre et est rattaché à la session de persistance.
...
Faire en sorte que l'appui sur le bouton de test1.jsp enregistre la valeur de test1Controller.myInput comme une nouvelle instance de Entry dans la base de données.
Contrôler la présence d'une nouvelle entrée dans la base de données à chaque clic.
| solution | ||||
|---|---|---|---|---|
Modifier la page test1.jsp
Ajouter dans Test1Controller la méthode addEntry
|
...
Afficher les objets de type Entry de la base de données sous forme d'une liste en dessous du bouton de test1.jsp.
On doit pour cela parcourir les entrées à l'aide de :
| Bloc de code |
|---|
<t:dataList value="#{test1Controller.entries}" var="entry">
<e:li value="#{entry.value} (#{entry.date})" />
</t:dataList>
|
...
Ajouter dans Test1Controller la méthode getEntries
...
