Bonjour les Lutins,
Sire, on en a gros....
Posons le contexte :
Le diagramme suivant représente le coeur de notre application tel que
Florian nous a aider a le faire. On s’interessera particulierement a la
relation Workstation -> Flow.
http://www.nomaka.fr/img/UML_Avant.png
Nous avons donc un contenant "Workstation" qui contient un contenu "Flow"
Notre premier code de création de Flow dans une Workstation est le suivant.
WorkstationDAO ws_dao=EasyFlowDAOHelper.getWorkstationDAO(transaction);
context.prepareTopiaId(Workstation.class, pWorkstation);
FlowDAO flow_dao=EasyFlowDAOHelper.getFlowDAO(transaction);
Flow newFlow = flow_dao.create(
,Flow.PROPERTY_BEGIN, pDate
,Flow.PROPERTY_RATIO,1);
workstation.addFlow(newFlow); // Nous considerions que le Flow etait lie
a la workstation ici
ws_dao.update(pWorkstation);
transaction.commitTransaction();
Nous nous assurions que les donnees etaient bien presentes par le chargement
de la workstation par son nom puis du Flow par son TopiaID.
Seulement lorsque nous avons voulu charger une workstation et tout les flows
qui lui sont lies il n’y avait aucun flow associes a la workstation.
Voici la requete TopiaQuery qui nous permet de recuperer la workstation et
ses Flows :
WorkstationDAO wsDAO = EasyFlowDAOHelper.getWorkstationDAO(transaction);
TopiaQuery wsQuery = wsDAO.createQuery("W");
wsQuery.addEquals(Workstation.PROPERTY_NAME,wsName);
wsQuery.addLoad(Workstation.PROPERTY_FLOW);
Workstation workstation = wsDAO.findByQuery(wsQuery);
Nous avons alors remis en cause le diagramme precedent et nous avons modifie
la liaison Workstation / Flow comme sur le diagramme suivant :
http://www.nomaka.fr/img/UML_Apres.png
ce qui nous donne une nouvelle fonction de creation du flow comme suit :
WorkstationDAO ws_dao=EasyFlowDAOHelper.getWorkstationDAO(transaction);
context.prepareTopiaId(Workstation.class, pWorkstation);
FlowDAO flow_dao=EasyFlowDAOHelper.getFlowDAO(transaction);
Flow newFlow = flow_dao.create(
Flow.PROPERTY_WORKSTATION,pWorkstation // ici on se dit
que cette fois, nous avons bien la relation....
,Flow.PROPERTY_BEGIN, pDate
,Flow.PROPERTY_RATIO,1);
pWorkstation.addFlow(newFlow);
ws_dao.update(pWorkstation);
transaction.commitTransaction();
Nous utilisons la meme methode de chargement qui ne nous renvoie toujours
pas ce qu’il nous faut...
La requete que nous avons reelement besoin est plus restrictive et utilise
un fetch mais ne recupere pas non plus le flow (logique en fait) :
WorkstationDAO wsDAO = EasyFlowDAOHelper.getWorkstationDAO(transaction);
TopiaQuery wsQuery = wsDAO.createQuery("W");
wsQuery.addEquals(Workstation.PROPERTY_NAME,wsName);
wsQuery.addFrom(Flow.class,"F");
wsQuery.addLeftJoin("W."+Workstation.PROPERTY_FLOW, null, true);
wsQuery.addWhere("F."+Flow.PROPERTY_END+" IS NULL");
Workstation workstation = wsDAO.findByQuery(wsQuery);
Nous pensons que nous avons un probleme avec nos relations dans notre
diagramme UML mais nous ne voyons pas ce qui ne vas pas...
Si c’est un probleme de code, nous ne voyons pas non plus...
Quelqu’un aurait une idee ?
Julien & Guillaume
Nomaka
Le Thu, 16 Sep 2010 00:36:43 +0200,
Julien NICOLAS <nicolas.julien.cg(a)gmail.com> a écrit :
>
> Voilà le contexte :
> Je souhaite charger une Workstation et le Flow qu'elle contient qui
> n'a pas de date de fin.
> Le chargement de la workstation se passe plutôt bien avec le code
> suivant :
>
> // Chargement des informations de la workstation.
> WorkstationDAO wsDAO =
> EasyFlowDAOHelper.getWorkstationDAO(transaction);
> Workstation workstation = wsDAO.findByName(pName);
>
> La où cela ce complique c'est pour le chargement du Flow.
> J'ai utilisé le code fournis précédemment par Florian et à peine
> adapté qui semble correspondre à notre besoin :
>
> TopiaQuery tQuery ;
>
> tQuery = fDAO.createQuery("F");
> // Ajout de l'entite Workstation au FROM
> tQuery.addFrom(Workstation.class, "W");
> // F doit être contenu dans la collection de Flow de la
> workstation
> // en HQL : F IN elements(W.flow)
> tQuery.addInElements("F", "W." +
> Workstation.PROPERTY_FLOW); // Recherche pour la workstation d?sir?
> tQuery.addEquals("W", workstation);
> // Condition de nullité
> tQuery.addNull("F." + Flow.PROPERTY_END);
>
> tQuery.execute(transaction)
>
> La question qui me démange est la suivante :
>
> tQuery.execute nous renvoie une liste. Mais comment la manipuler ?
> dois-je simplement l'ajouter à la collection Flow de la workstation
> ou c'est mal et le meilleur moyen est tout autre ?
Il est préférable d'utiliser les méthodes d'execution de requete
depuis le DAO pour garder le typage des résultats (findAllByQuery,
findByQuery).
>
> Sinon il n'y a pas un autre moyen de faire le chargement de notre
> liste de Flow contenu dans notre workstation en passant par notre
> workstationDAO ? Ou alors directement préciser dans le FlowDAO que le
> Flow que l'on cherche doit être lié à la workstation ?
Si en fait ce serait plus simple d'utiliser le workstationDAO, la
requête en HQL :
SELECT W FROM Workstation W JOIN FETCH W.flow F WHERE F.end IS NULL;
A lire (doc de référence HQL) :
http://docs.jboss.org/hibernate/core/3.3/reference/fr/html/queryhql.html
Note : en relisant la doc je viens de m'apercevoir du WITH plutot que
WHERE dans une jointure qui serait plus pertinent dans ton cas (même
si le résultat sera probablement identique). Un ajout à faire dans la
méthode addJoin de la TopiaQuery. Il faudrait que je fasse des essais.
>
> Une autre question, j'ai cherché l'aide en ligne de Topia et je
> n'arrive pas à mettre la main sur quelque chose approchant
> l'exhaustivité... C'est normal car la doc n'est pas terminé où tout
> simplement je ne vais pas au bon endroit :
> http://topia.labs.libre-entreprise.org/topia/topia-persistence/howto.html
Obsolète, regarde bien la version qui ne correspond pas du tout à celle
que tu utilise (2.1.6 contre 2.4). D'ailleurs ToPIA n'est plus hébergé
sur le labs mais sur www.nuiton.org/projects/show/topia
La doc de TopiaQuery :
http://nuiton.org/embedded/topia/topia-persistence/TopiaQuery.html
> Si il y a moyen de la renseigner, on est prêt à s'y coller au fil des
> blocages que nous rencontrons. Nous pouvons écrire un p'tit bout de
> doc à chaque fois et vous la mettez en ligne si celle-ci est
> pertinente et vous plais.
Compléter la FAQ peut être intéressant, pour le moment tu peux envoyer
des mails ou patch svn pour intégrer des bouts de doc (un outil est en
cours de mise en place pour modifier la documentation mais il faut un
droit de commit).
>
> Voilà, nous rentrons dans la partie qui vas demander des requêtes de
> plus en plus complexe pour nos entité alors on risque de poser
> quelques autres questions... en espérant retrouver rapidement nos
> adresse du domaine pour reprendre la liste de TopiaUser.
> A deux, être bon dans tous les domaines c'est pas facile mais on se
> bat ! Chaque nouveau pas est une bataille remportée. Il nous reste
> pas mal de chemin mais on ne se laisse pas abattre.
N'hésite pas a bien parcourir la doc HQL d'hibernate et celle de
TopiaQuery, normalement tu devrais pouvoir facilement passer du SQL au
HQL à la TopiaQuery ce qui devrait répondre à la plupart des
problématiques :) Mais si tu as des questions je suis toujours prêt à
t'aider !
>
> Merci à vous les Lutins pour Topia et EUGene (entre autre) qui nous
> facilitent le codage... tout en nous faisant mal à la tête quand on
> réfléchi comme avant => connecté directement à la base de données
> alors que c'est mal et qu'il nous faut déréfléchir ! (...oui
> déréfléchir ca fait mal à la tête !)
> Merci aussi pour la logistique et l'aide salvatrice.
>
> Julien et Guillaume.
> Nomaka
--
Florian Desbois <fdesbois(a)codelutin.com>
SSLL Code Lutin
http://www.codelutin.com
tel : 02 40 50 29 28
Réseau Libre-Entreprise