Introduction
Dans ce TP nous allons manipuler les relations. Nous continuons le TP sur les comptes bancaires. Nous allons associer à chaque compte bancaire un historique : une liste d'opérations bancaires, sous la forme d'une relation 1-N. Un compte bancaire aura n opérations reliées.
Par exemple :
![afficheDetails.jpg](/@api/deki/files/463/=afficheDetails.jpg)
Creation d'un entity bean OperationBancaire
Première étape : ajouter au projet un entity bean correspondant à une operation bancaire. Il aura comme attributs
un id (sa clé primaire),
une description (par exemple "création du compte", "débit", "crédit"...),
la date de l'opération (de type java.util.date), et
le montant impliqué (positif pour un crédit, négatif pour un débit, le solde initial pour une création).
Ne copiez/collez pas ce code intégralement,
ommetez l'attribut de type Date, celui-là vous le saisirez à la main : lorsque vous taperez l'attribut de type Date (on vous proposera d'importer java.util.Date), automatiquement, une annotation de code @temporal apparaitra. Oui, les dates sont bien des types spéciaux !
@Entity
public class OperationBancaire implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String description;
@Temporal(javax.persistence.TemporalType.DATE)
private Date dateOperation;
private int montant;
public OperationBancaire() { }
public OperationBancaire(String description, int montant) {
this.description = description;
this.montant = montant;
dateOperation = new Date();
}
Ajout de la relation dans l'entity bean CompteBancaire
Il suffit de taper la ligne correspondant à l'attribut "liste d'opérations bancaires" dans le bean CompteBancaire pour qu'une ampoule jaune vous propose d'insérer une annotation correspondant à une relation @OneToMany.
Ne copiez/collez pas le code, tapez le !
Vous compléterez l'annotation avec les attributs concernant le cascading et le chargement :
CascadeType.ALL signifie que si on persiste un compte on persiste aussi l'historique, idem pour une suppression.
L'attribut FetchType indique que lorsqu'on fait un select sur un compte, on charge aussi son historique.
La relation ici est uni-directionnelle.
@Entity
public class CompteBancaire implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String nom;
private int solde;
@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
private Collection<OperationBancaire> operations = new ArrayList();
public Collection<OperationBancaire> getOperations() {
return operations;
}
public void setOperations(Collection<OperationBancaire> operations) {
this.operations = operations;
}
....
Detruisez les tables existantes, puisque le modèle de données va changer !
Pour la suite, détruisez les tables COMPTES_BANCAIRES, etc de votre projet.
Il y a un ordre pour les détruire...
Vous pouvez deployer le projet et regarder les tables générées qui devraient ressembler à ceci :
![tablesRelatons.jpg](/@api/deki/files/461/=tablesRelatons.jpg)
Modifiez le session bean GestionCompteBancaires
Associer une operation à chaque modification d'un compte
...pour qu'il associe une operation bancaire chaque fois qu'un compte est modifié. Voici un exemple dans la méthode de création de compte :
public void creerCompte(String nom, int solde) {
CompteBancaire c = new CompteBancaire(nom, solde);
OperationBancaire op = new OperationBancaire("Création du compte", solde);
c.getOperations().add(op); // ici on ajoute la relation
persist(c);
}
A vous de modifier la méthode qui permet de transférer de l'argent
(attention, pas de persist !!!!! Il suffit d'ajouter une opération, cela mettra à jour automatiquement la relation).
Ajouter une méthode qui permette de chercher un compte
public CompteBancaire getCompte(int id) {
// code à écrire !
}
Pensez à l'exposer dans l'interface !
Modifiez la JSP qui affiche la liste des comptes
Objectif : Pour que chaque compte dans la liste ou dans le tableau propose un lien qui appelle la servlet de contrôle avec une action indiquant que l'on désire afficher l'historique du compte
(en cliquant sur le lien "Détails", cela appelle la servlet qui appelle un ejb puis qui appelle une JSP pour affichage des détails de l'historique).
![details.jpg](/@api/deki/files/462/=details.jpg)
Lorsqu'on clique sur un de ces liens, cela appelle la servlet avec le paramètre action positionné à "historiqueCompte" par exemple, et
on passe aussi un paramètre avec l'id du compte (dans le lien).
La servlet récupère le compte et appelle une nouvelle JSP AfficheHistoriqueCompte.jsp en passant le compte renvoyé dans la requête http.
Ecriture d'une JSP pour l'affichage de l'historique d'un compte
Il reste maitenant à écrire la JSP qui va se charger d'afficher les détails du compte passé en paramètre dans la requête.
Rappel : cette JSP est appelée par la servlet.
A vous de l'écrire en vous inspirant du code écrit par la JSP qui affichait la liste des comptes bancaires.
![afficheDetails.jpg](/@api/deki/files/463/=afficheDetails.jpg)
Notes et archives des TPs rendus M2 Miage NTDP 2010-2011