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

Langage Java Discussion :

Application lièée à une base de données ET JavaBeans


Sujet :

Langage Java

  1. #1
    Invité
    Invité(e)
    Par défaut Application lièée à une base de données ET JavaBeans
    Bonjour,

    J'ai une application qui utilise des données dans une BDD.
    J'ai un Objet Client avec des méthodes getName(), setName().

    J'hésite sur un aspect :
    - faut-il créer une méthode Client.save() qui sauveras les données dans la BDD et le constructeur iras rechercher les données dans la BDD.
    - faut-il écrire getName() qui iras chercher le nom dans la BDD et setName() qui iras ajouter/metter à jour le nom dans la BDD ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Mais quel est le context pluis en détails ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le contexte ?

    Et bien, je travaille sur une "grosse" application Standalone.
    Chaque "client" possède une connection au SGBD (MySql).
    Et j'ai plusieurs objets avec une vingtaine d'attributs ( et donc de getters et de setters)..
    Dernière modification par Invité ; 09/08/2006 à 12h03.

  4. #4
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Hibernate peut etre une solution envisageable dans ton cas.
    Jettes y un oeil.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui je sais que Hibernate pourrait m'apporter une solution. Mais
    - Je ne connais pas (encore) Hibernate et je n'ai plus vraiment le temps de l'apprendre pour ce que je veux faire.
    - Je me demande quel est la meilleure des solutions. Des petites requêtes pour accéder aux attributs ou une grosse requête pour tout charger en une fois.
    C'est aussi et surtout dans un but théorique cette question.

    Alors imaginons que java ne sois pas un superbe langage dotté de trés nombreuses API's et d'une communauté trés active et trés compétentes...
    Quel serait la meilleure approche dans ce cas ?
    des méthodes get..() et set..() qui accédent à la DB pour chaque attribut ou un constructeur et une méthode save qui chargent/sauvent tous les attributs..

    Dans les cas des getters et setters je ferais un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private String nom;
    ...
    public String getNom() {
        if ( nom == null ) {
            nom = /* Requête dans la DB */
        }
        return nom;
    }

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Perso je me prononcerais plutôt vers des requêtes chargeant directement un objet voire une liste d'objet.
    A part ça sur la méthode, au dieu de faire directement les appels dans les objets en question je passerais plutôt par l'emploi du pattern DAO qui permet de créer une surcouche permettant de lier tes beans à la base de donnée et donc bien séparer ton code.

    Comme d'hab direction un tuto de sun à ce sujet:

    http://java.sun.com/blueprints/corej...essObject.html
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ok, merci beaucoup.
    En fait pour l'instant j'ai une classe Listing qui me charge des collectiosn d'objets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Collection clients = Listing.getListeClients();
    Citation Envoyé par sinok
    Comme d'hab direction un tuto de sun à ce sujet:
    http://java.sun.com/blueprints/corej...essObject.html
    Erf, je ne trouve jamais les bons tutos quand il faut..

  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
    Idem pour mon avis, je passerai *au moins* par une couche DAO, à défaut d'utiliser Hibernate (qui, cela dit, n'est pas forcément des plus compliqué à assimiler ).

    Sinon pour tes deux idées :
    1- Accéder à la BDD a chaque getter/setter et une très mauvaise solution. Si l'application est trop fortement utilisée (et par de nombreux utilisateurs), imagines le nombre d'accès en base, de requetes exécutées ... ton serveur de BDD lachera dans la demi-heure (ou bien la file d'attente sera pleine si tu utilises un pool de connexion).

    2- Utiliser une méthode save() semble alors la meilleure solution si l'on considère uniquement le nombre d'appels en base à limiter. Toutefois, dans un esprit de développement en entreprise et afin de limiter la maintenance à une partie restreinte de ton application (plutot que de faire du JDBC dans chaque classe), il est utile (voire important, primordial, enfin c'est au choix ) de séparer les couches logiques* de ton application. Ainsi, au même titre que ton objet "Client" ne renverra pas une méthode avec l'IHM (genre un panel client), ce dernier ne devrait normalement pas accéder à la base de données, mais faire appel à une couche différente (celle appelée DAO).

    Libre à toi donc de faire comme tu préfères, mais centraliser les accès en base reste assez indiqué. Tu peux maintenant envisager deux types d'accès :
    - couche DAO (un objet DAO gère un objet du modèle métier ex : Client possède son ClientDAO pour save(), load(), delete(), etc.)
    - service de persistance : un objet qui sauvegardera n'importe quel objet métier de ton application (hibernate le fait, par exemple)

    Tu peux également cumuler les deux et permettre ainsi des traitements spécifiques à certains objets. Au délà d'Hibernate, il existe d'autres outils intéressants et moins complexes à mettre en oeuvre comme Ibatis par exemple, qui propose une solution d'externalisation de la couche SQL (+mapping Objet/Relationnel) si tu préfères utiliser une couche DAO

    Voila, si tu as des questions, n'hesites pas
    See you, space cowboy... and if you're satisfied, click on

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ok,

    Merci beaucoup. Je vais donc passer progressivement avec une couche DAO pour mes classes. Si je comprend bien, la couche DAO fait partie du ou est le 'M' de 'MVC'.

    Pour ce qui est d'hibernate,je n'ai jamais dis que c'était compliqué juste que je ne pouvais pas me permettre de lire la doc pour le moment (et je ne sais pas non plus si l'application en vaut la peine).


    Citation Envoyé par Bizur
    Client possède son ClientDAO pour save(), load(), delete(), etc.)
    C'est à dire que client contient un objet ClientDAO ?
    -> ha non, je n'ai rien dis désolé ( je n'avait pas encore parcourus le document de sun.. )

  10. #10
    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
    Ah ui, pardon, je m'étais mal exprimé à ce sujet, j'en conviens

    Pour le M ... on peut voir cela ainsi en effet mais j'aurai plus tendance à le sortir du modèle MVC, il vient plus s'interposer entre le M (qui, en soi, représente l'ensemble de ton modèle métier) et la base de données ... un peu comme une couche supplémentaire. Maintenant, quitte à le rentrer dans une des trois lettres, oui, il se situerait dans le M

    En gros donc, pour mieux m'exprimer, je dirai qu'à chaque classe métier correspondra un DAO (ex : si il existe une classe Client, il existera une classe ClientDAO) voila, tu l'as apparemment compris, mais je précisais pour ceux qui liraient ce post plus tard
    See you, space cowboy... and if you're satisfied, click on

  11. #11
    Invité
    Invité(e)
    Par défaut
    D'accord, ça se clarifie de plus en plus.
    Il ne me reste qu'a commencer à l'utiliser pour me/vous poser d'autres questions..



    je ne marque donc pas le post "résolu" tout de suite mais je ne l'oublie pas.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Dans les documents de BluePrints, on fait souvent référence à des Transfer Object
    J'ai bien trouvé un lien vers ce pattern mais si quelqu'un pouvais me faire une petite introduction en Français..

    Merci

  13. #13
    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 transferts objects sont les DTO ... il me semble que c'est encore une autre couche aux DAO. Menfin je ne saurais te renseigner minutieusement sur le sujet puisque moi même je n'en suis pas très connaisseur

    Tout ce que je dirai est que, d'apres ce que j'ai lu, Hibernate semblerait remplacer cette couche DTO (qui sert essentiellement a gerer les états des objets il me semble).
    See you, space cowboy... and if you're satisfied, click on

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par BizuR
    Les transferts objects sont les DTO
    Oui c'est ça.

    Citation Envoyé par BizuR
    ... il me semble que c'est encore une autre couche aux DAO.
    Oui mais ils ont l'air assez liées quand même..
    --> http://java.sun.com/blueprints/corej...essObject.html
    Figure 9.1 Data Access Object
    Figure 9.2 Data Access Object sequence diagram
    Example 9.5 Customer Transfer Object

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

Discussions similaires

  1. problème d'application utilisant une base de données
    Par hayat2 dans le forum Bases de données
    Réponses: 12
    Dernier message: 29/09/2009, 18h10
  2. Synchroniser une application avec une base de données centrale
    Par Sayrus dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 25/08/2009, 20h22
  3. Une application avec une base de données
    Par nabil148911 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 05/03/2008, 11h21
  4. Liste déroulante liée à une base de donnée
    Par GruZloR dans le forum Excel
    Réponses: 4
    Dernier message: 05/01/2008, 16h55
  5. Liée une base de donnée à une image
    Par ecarbill dans le forum Access
    Réponses: 4
    Dernier message: 05/08/2006, 12h07

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