Pages enfant
  • 3.3.5 Écriture du code d'accès aux objets métiers

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Commentaire: Migrated to Confluence 5.3
Remarquetip
titleA compléterRelu

Relecture RBA revoir

Sommaire :

Sommaire
maxLevel3

...

esup-commons préconise le développement en couches :

  Version:1.0 StartHTML:0000000167 EndHTML:0000005762 StartFragment:0000000762 EndFragment:0000005746

Accès aux données

Pour pouvoir avoir accès à l'objet User donné en exemple au paragraphe précédent la couche métier doit disposer de méthodes dans l'interface DaoService.

...

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. h3.

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.

 

...

Écrire les méthodes ci-dessus dans les classes ad hoc.

...

Ajouter à l'interface DaoService :

Bloc de code

void addEntry(Entry entry);
List<Entry> getEntries();

Ajouter dans la classe HibernateDaoServiceImpl:

Bloc de code

void addEntry(Entry entry) {
 addObject(entry);
}

List<Entry> getEntries() {
 return getHibernateTemplate().loadAll(Entry.class);
}

Ajouter à l'interface DomainService :

Bloc de code

Entry addEntry(String value);
List<Entry> getEntries();

Ajouter dans la classe DomainServiceImpl:

...

.

...

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

Bloc de code

<%@include file="_include.jsp"%>
<e:page stringsVar="msgs" menuItem="test1"
  locale="#{sessionController.locale}">
  <%@include file="_navigation.jsp"%>
  <h:form>
 	<e:messages/>
	<e:inputText value="#{test1Controller.myInput}"/>
	<e:commandButton value="#{msgs['MESSAGE.ENTRY.SAVE']}"
		action="#{test1Controller.addEntry}"/>
	<e:commandButton value="SetTest2Value"
		action="goToTest2">
        	<t:updateActionListener value="#{test1Controller.myInput}"
				property="#{test2Controller.value}"/>
	</e:commandButton>
  </h:form>
</e:page>

Ajouter dans Test1Controller la méthode addEntry

Bloc de code

/**
 * Add an entry.
 */
public void addEntry() {
  getDomainService().addEntry(getMyInput());

}

...

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

...