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

Persistance des données Java Discussion :

[iBATIS] Relations entre objets


Sujet :

Persistance des données Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut [iBATIS] Relations entre objets
    Bonjour à tous,

    Je début le développement Web en java et pour cela j'utilise le framework Spring que j'ai appris grâce aux articles de Serge Tahé principalement. en ce qui concerne la gestion de la persistance, j'utilise iBATIS comme dans l'article par contre je me demande s'il est possible de gérer les relations entre objets.

    Je m'explique, supposons que j'ai un objet A:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class A {
        private int id;
        private String nom;
        // getters, setters, constructeurs...
    }
    et un objet B qui contient un objet A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class B {
        private int id;
        private String nom;
        private A a;
        // getters, setters, constructeurs...
    }
    dans ma base de données j'ai une table pour stocker les A [int(11) id, varchar(100) nom] et une autre pour stocker les B [int(11) id, varchar(100) nom, int(11) id_a].

    est-il possible de faire un fichier de mapping qui va me gérer tout seul la liaison? C'est-a-dire que quand je vais faire un select d'un objet B, il me crée et me lie l'objet A correspondant?

    (J'espère être clair )

    Merci d'avance

  2. #2
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Tant que j'y suis, je cherche même à aller encore plus loin: que l'objet B contienne une collection d'objets A:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class B {
        private int id;
        private String nom;
        private A[] a;
    }
    Je crois que pour un seul c'est possible (comme pour mon message précédent) mais pour ça je n'ai (encore) rien trouvé

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    C'est bon j'ai trouvé. Pour ceux que ça intéresse, la réponse se trouve dans le Developper Guide:

    Exemple:

    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
     
    <resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
    <result property=”id” column=”CAT_ID”/>
    <result property=”description” column=”CAT_DESCRIPTION”/>
    <result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>
    </resultMap>
    <resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
    <result property=”id” column=”PRD_ID”/>
    <result property=”description” column=”PRD_DESCRIPTION”/>
    </resultMap>
    <select id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
    select * from CATEGORY where CAT_ID = #value#
    </select>
    <select id=”getProductsByCatId” parameterClass=”int” resultMap=”get-product-result”>
    select * from PRODUCT where PRD_CAT_ID = #value#
    </select>

  4. #4
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    En effet, iBATIS est un outil de mapping O/R externalisant la couche SQL principalement (et mappant les objets avec ses fichiers de config). Il n'apporte pas autant de fonctionnalités que ses concurrents Hibernate et JPOX, demande plus de developpement (il faut implémenter tous les DAO uns par uns pour la sauvegarde par exemple) mais reste plus souple puisqu'il se contente uniquement, comme je le disais, de mapper et déplacer les requetes SQL dans un fichier XML.

    Juste pour prévenir, si jamais tu viens à utiliser l'héritage, sache qu'iBATIS le gère mais que sa dernière doc (enfin celle que j'ai lue il y a 3 mois) ne l'évoque pas. Pour une solution à ton problème "copie" la méthode .NET (la doc .NET en parle par contre) et adapte la à la DTD d'iBATIS pour java (quelques noms de tags qui changent à quelques lettres pres

    Petite info toutefois sur ta solution, ici tu envisages le lazy loading ou non ?!? Si tel est le ca,s tu vas surement tomber dans la problématique du N+1 select, la dsocumentation traite également de ce sujet ... lis le pour etre sur de ne pas limiter les performances de ton mapping (notamment en optimisant l'association avec chargements par lot ou direct).

    Bon courage avec cet outil qui offre un bon nombre de possibilités
    See you, space cowboy... and if you're satisfied, click on

  5. #5
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Merci de ta réponse.

    J'ai mis ici un exemple, seulement pas mon utilisation réelle. J'utiliserai très certainement le lazy loading mais pas seulement. Je m'en servirai uniquement pour les objets que je veux garder en cache, conformément à la doc. Celle que j'ai lue date de début Août mais je n'ai rien vu à propos de l'héritage, ceci dit je n'ai pas tout tout lu en détails et je crois (mais pas sûr) que mon SGBD, MySQL, ne le supporte pas (déjà qu'il ne semble pas supporter les foreign key..)

    Concernant Hibernate par exemple, je sais qu'il es très populaire et est certainement plus utilisé qu'iBATIS mais j'ai choisi d'utiliser iBATIS un peu par hassard: en lisant les articles sur Spring de Serge Tahé et je me suis dit pourquoi pas

    J'essaierai cependant certainement hibernate dans les mois à venir mais là j'apprends déjà beaucoup de choses à la fois: je passe du PHP "simple" au Java EE avec l'utilisation de Spring dans une architecture 3tier. Mes neurones fument ^^

  6. #6
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Pas de souci

    Pour l'héritage, aucun SGBDR ne le supporte ... c'est justement pour cela qu'il existe des stratégie de mapping spécifique (tu peux te documenter de manière théorique sur le site d'Hibernate ou celui de JPOX au sujet de ces stratégies, il me semble qu'iBatis propose bien évidemment les mêmes .... donc ne t'en fais pas )

    Quelle version de MySQL utilises tu ?!? Si tu veux des foreign key, il faut employer des tables de type InnoDB. Les autres proposées par MySQL ne le gèree pas en effet
    See you, space cowboy... and if you're satisfied, click on

  7. #7
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    J'utilise la version 5.0.22 en local, sur le serveur de déploiement je ne sais pas encore quelle version il y aura. Mes tables utilisent bien le moteur InnoDB. Pour l'instant j'utilise phpMyAdmin pour l'admin de MySQL, comme je n'ai trouvé aucune option pour les clés étrangères, j'en ai déduit rapidement que MySQL ne les gérait toujours pas

    EDIT: il s'agit de la version gratuite Community

  8. #8
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Les clés étrangères sont donc prises en compte ... toutefois, phpmyadmin ne gère peut etre pas la fonctionnalité. En utilise MySQL Administrator, tu pourras les gérer sans aucun problème (téléchargeable gratuitement sur le site de MySQL)
    See you, space cowboy... and if you're satisfied, click on

  9. #9
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    Je viens de le faire et c'est bien pratique, merci beaucoup pour ton aide, tu m'as bien avancé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Relations entre objets
    Par Jean-Marc68 dans le forum C#
    Réponses: 2
    Dernier message: 11/09/2014, 12h52
  2. Inclusion d'objet - Relation entre objet
    Par ejl07 dans le forum Hibernate
    Réponses: 0
    Dernier message: 25/07/2009, 18h53
  3. Portées des propriétés-Relations entre objets
    Par Marmounet dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 25/09/2008, 10h40
  4. Réponses: 6
    Dernier message: 18/02/2008, 23h24
  5. Relation entre objets rollback et buffer cach
    Par Mehdilis dans le forum Oracle
    Réponses: 1
    Dernier message: 04/09/2006, 08h33

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