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 :

Mettre à jour un objet composé de deux tables: bonnes pratiques ?


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut Mettre à jour un objet composé de deux tables: bonnes pratiques ?
    Bonjour,
    J'utilise Spring MVC mais pas JPA/Hibernate, je fais donc mes requêtes à la main en SQL.
    J'ai un objet Adherent qui contient un objet Personne, quand j'arrive dans ma classe DAO j'arrive avec un adherent et je fais en SQL un update de la table adherent puis juste après un UPDATE de ma table personne.
    Sauf que Personne est aussi utilisé pour l'objet auteur qui contient un objet personne. Ça m'embête d'écrire de chacun des DAO (Adherent et Auteur) du code qui met à jour la table personne (avec les mêmes données).
    Quelle est la bonne pratique ?
    Dois-je créer un DAO personne ? Mais du coup ou l'appeler ? Dans le service ? Dans chacun des DAO Adherent et Auteur ?
    Merci d'avance pour vos conseils.

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 136
    Par défaut
    Dupliquer du code, c'est une source de futur problème.
    Donc oui, je créerai une DAO pour Personne et ferai l'update dans le service (Bien vérifier que le service est transactionnel!).
    Si un jour la table personne change, tu n'a qu'un seul endroit ou changer ça, tu limite la responsabilité à une seul DAO, le service étant le responsable de la cohérence du tout.

  3. #3
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    OK.
    Par contre quand je suis dans mon DAO adherent comment récupérer le DAO de personne ? Aujourd'hui je fais un new DaoPersonne en lui passant en paramètre le Datasource car dans ma classe Personne si le DatatSource est en autowired ça ne fonctionne pas. Y-a-t-il une meilleure solution ?

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 136
    Par défaut
    new et Spring ne font pas bon ménage !

    Jamais au grand jamais tu ne doit faire un new d'une DAO ou d'un Service (sauf dans le cas du Javaconfig mais uniquement dans le fichier @Configuration).

    Quand tu fait un new toto(), Spring ne passe pas par dessus, donc rien ne sera autowired.

    Normalement, tu devrai avoir 2 DAO et un service.

    DAO Adherent
    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
     
    public class AdherentDAOImpl implements IAdherentDAO {
     
         private    DataSource datasource;
     
        @Autowired
        public AdherentDAOImpl(DataSource datasource) {
             this.datasource = datasource;
     
       }
     
       @override
      public  void save(Adherent adherent) {
              //Code du save
     
       }
    }
    DAO Personne
    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
     
    public class PersonnetDAOImpl implements IPersonneDAO {
     
         private DataSource datasource;
     
        @Autowired
        public PersonneDAOImpl(DataSource datasource) {
             this.datasource = datasource;
     
       }
     
       @override
      public  void save(Personne personne) {
              //Code du save
     
       }
    }
    Ton service
    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
     
    public classe MonSuperServiceImpl implements IMonSuperServiceImpl  {
     
       @Autowired
       private IPersonneDAO  personneDao;
     
      @Autowired
      private AdherentDAOImpl  adherentDao;
     
       @Override
       public void saveAdherent(mes parametre adherent et personne) {
     
         adherentDao.save(adherent);
         personneDao.save(personne);
     
       }
     
    }
    Le tous devrait être instancié par Spring
    • @Bean sur une methode si Javaconfig
    • <bean class="...."> si xml
    • DAO et service annoté en @component / @Service si tu utilise le component scan

  5. #5
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    OK je déplace mon code au niveau du service.
    Par contre si j'ai à gérer une transaction j'utilise l'annotation @Transactionnal dans le DAO mais comment je fais si je suis dans le service ?

  6. #6
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    Je viens de me rendre compte qu'il suffit de mettre l'annotation @transactionnal au niveau du service et non au niveau du DAO.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/10/2009, 05h23
  2. Mettre à jour un curseur composé
    Par Jcpan dans le forum PL/SQL
    Réponses: 2
    Dernier message: 18/10/2008, 16h33
  3. Réponses: 3
    Dernier message: 13/08/2008, 08h54
  4. Réponses: 4
    Dernier message: 04/05/2008, 23h39
  5. mettre à jour un objet place dans le contexte de l'appli
    Par lilli1407 dans le forum Struts 1
    Réponses: 6
    Dernier message: 09/11/2006, 16h58

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