IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

[Spring Dao][JDBC] SimpleJdbcTemplate, RowMapper et collections


Sujet :

Spring Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Spring Dao][JDBC] SimpleJdbcTemplate, RowMapper et collections
    Bonjour,

    Parceque je n'arrive pas à faire fonctionner un mapping avec HIbernate (http://www.developpez.net/forums/sho...d.php?t=553582) et qu'il faut avancer, j'ai décidé de passer à SImpleJdbcTemplate.

    J'ai donc crée mes deux mappers : 'RoleMapper' et 'ResourceMapper'.
    'Role' était très simple à mapper car ne possède que trois attributs simples. 'Resource' suand à lui possède un Set de 'Roles'.

    Je vois donc plusieurs façons de récupérer un 'Resource' complet :
    a) Obtenir toues les informations en une requête et, dans le 'ResourceMapper' faire une soorte de boucle de rupture sur le ResultSet en appelant 'RoleMapper' pour charger le Set.
    Mais le problème est que les noms/index de colonnes changent lorsque je veux charger juste un 'Role' ou lorsqu'il sont chargés pour remplir un 'Resource' (SELECT resources.name, roles.name as r_name..)

    b) Obtenir la 'Resource' avec une requête et réexécuter une sous requête pour charger les 'Roles'.
    Mais celà me feras exécuter deux requêtes pour de sinfos récupérables en une seule.

    c) Obtenir toutes les informations en une requête et écrire un 'ResourceMapper' qui se chargerais luyi même de mapper les 'Roles'.
    Mais cela multiplie mon code.

    Bien que la dernière solution ne soit pas superbe à cause du dédoublement de code, les trois sont valables (si j'utilise la solution 'a', je peux prendre une convention pour nommer les champs de résultats) mais je me demande laquelle serait les plus pratique/simple/optimisée.
    Je pense que la 'a' est la plus optimisée car une seule requête, que la 'b' est la plus pratique car pas convention de nommage et, enfin, que la 'c' est la plus simple car pas de prises de têtes.

    Et vous, comment faites-vous ou comment ferriez-vous ?

    Merci
    Dernière modification par Robin56 ; 05/08/2013 à 13h17. Motif: Ajout du préfixe

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    1. Je ne vois pas comment tu vas recuperer toutes les informations en une seule. Même avec une jointure, tu auras une ligne par couple Ressource<->Role. Donc je vois mal comment faire dans un RowMapper.

    2. C'est à mon avis la solution préférable. Un Dao Ressource, un Dao Role et un service qui charge un Ressource+Role via les deux Dao.

    3. Pareil que 1.
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Hikage Voir le message
    1. Je ne vois pas comment tu vas recuperer toutes les informations en une seule. Même avec une jointure, tu auras une ligne par couple Ressource<->Role. Donc je vois mal comment faire dans un RowMapper.
    Je ferais un truc comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    String sql = "SELECT 
           res.url aAS resource_url, res.description AS resource_description,
           roles.name AS role_name, roles.description AS role_description
                    WHERE
           res.url=acl.resUrl AND role.name=acl.roleName
                    ORDER BY res.url";
    // Et dans le mapper :
    Resource resource = new Resource(
                                    rs.getString("resource_url"),
                                    rs.getString("resource_description") );
    do {
      Role role = new Role( 
           rs.getString("role_name"),
           rs.getString("role_description"),
           rs.getBoolean("role_enabled") );
      resource.add( role );
    } while ( rs.next() && resource.getUrl().equals(rs_getString("resource_url") );
    /* Je ne suis plus sur des noms de méthodes mais le but est de placer le 
     * ResultSet sur la position précédente (La ligne qui conteint une autre url) */
    rs.absolute( rs.cuirrent()-1 );
    Citation Envoyé par Hikage Voir le message
    2. C'est à mon avis la solution préférable. Un Dao Ressource, un Dao Role et un service qui charge un Ressource+Role via les deux Dao.
    Mmmm oui j'y avais pensé mais le problème est que Hibernate me permet de récupèrer un 'Resource' complet depuis mon DAO sans avoir à passer par un service. Et je n'ai pas abandonné l'idée d'utiliser Hibernate, ce serais donc bête d'écrire un service différent en fonction du dao.. et de restreindre le dao hibernate. D'autant plus que j'aime bien l'idée d'obtenir un objet complet depuis son DAO, ça me semble même plus logique.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2008, 10h11
  2. [Data] Problème spring DAO JDBC
    Par Ethylene dans le forum Spring
    Réponses: 1
    Dernier message: 07/03/2008, 20h34
  3. [Spring][Hibernate]illegal access to loading collection
    Par ysoubigo dans le forum Hibernate
    Réponses: 2
    Dernier message: 24/01/2008, 15h24
  4. [Data] Spring Dao [SimpleJdbcTemplate]
    Par alexandre7 dans le forum Spring
    Réponses: 2
    Dernier message: 18/05/2007, 15h05
  5. Comparatif Spring DAO/Hibernate
    Par joseph_p dans le forum JDBC
    Réponses: 3
    Dernier message: 23/02/2007, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo