Partage
  • Partager sur Facebook
  • Partager sur Twitter

Java EE inscription et attribution d'un rôle

    16 janvier 2018 à 14:51:07

    Bonjour à tous,

    J'essaye actuellement d'ajouter un rôle à mes utilisateurs lors de l'inscription mais je n'y arrive pas. J'ai une table user_has_role (id du user/ id du role), une table user_role (id, role_name), et ma table user qui contient toutes les informations pour inscrire un utilisateur.

    J'aimerai, dans la méthode "create" de mon userDAO pouvoir appeler ma procédure de création d'un utilisateur ET celle de l'insertion du rôle. J'arrive bien à ajouter l'utilisateur dans ma base de données, mais impossible de lui insérer un rôle.

    public SQLException create(User user) throws Exception {
            Connection myConn = null;
            PreparedStatement myStmt = null;
    
            try {
                // get DB connection
                myConn = dataSource.getConnection();
                // create SQL for insert
                String sql = "CALL insert_user(?,?,?,?,?,?)";
                //String sql2 = "CALL insert_role_to_user(?,?)";
    
                myStmt = myConn.prepareStatement(sql);
    
                // set the param values for the user
                myStmt.setString(1, user.getLastName());
                myStmt.setString(2, user.getFirstName());
                myStmt.setString(3, user.getEmail());
                myStmt.setString(4, user.getLogin());
                myStmt.setString(5, user.getHash());
                myStmt.setBoolean(6, false);
    
                //myStmt.setInt(1, user.getId());
                //myStmt.setInt(2, 3);
    
                // execute sql insert
                myStmt.execute();
    
                return null;
            } catch (SQLException se) {
                //return se.getMessage();
                return se;
            } finally {
                // clean up JDBC objects
                close(myConn, myStmt, null);
            }
        }



    Auriez-vous des idées à me proposer ?

    Merci d'avance

    -
    Edité par Miguelit_0 16 janvier 2018 à 14:52:13

    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2018 à 15:43:30

      CALL insert_user(?,?,?,?,?,?)  ?

      Hum du SQL?

      Il ne faudrait pas plutôt :

      INSERT INTO user VALUES (?,?,?,?,?,?)
      • Partager sur Facebook
      • Partager sur Twitter
        16 janvier 2018 à 15:45:36

        Pardon, j'ai oublié de préciser que c'est un projet scolaire, et qu'on est fortement poussé par le prof à utiliser des procédures stockées...

        Du coup la procédure : 

        BEGIN 
        
        	start transaction;
        
            INSERT INTO user (usr_last_name, usr_first_name, usr_email, usr_login, usr_password, usr_is_blocked)
        
            VALUES (last_name, first_name, email, login, password, is_blocked);
            
            commit;
        
        END

        Et l'autre pour le rôle 

        BEGIN
        
            INSERT INTO user_has_role(uhr_fk_id_user, uhr_fk_id_user_role)
        
            VALUES  (idusr,idrole);
        
        END



        • Partager sur Facebook
        • Partager sur Twitter
          16 janvier 2018 à 15:58:45

          Je n'ai jamais travaillé avec ça.
          Tu as essayé en mode debug pour voir si le déroulé de ton try se fait correctement?

          C'est surprenant que ça passe sans message d'erreur.

          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2018 à 16:26:33

            Bah en fait c'est plutôt pour demander une marche à suivre pour ajouter plusieurs script SQL au sein d'un même DAO. J'aimerai faire appel à ma procédure qui ajoute le user, et à la procédure qui ajoute l'id du user + son rôle dans ma table "user_has_role" dans ma méthode "create".

            Je sais pas si je suis très clair :/

            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2018 à 16:52:05

              Si j'ai bien compris tu veux qu'au moment où tu inserts un nouvel utilisateur dans table user en parallèle il est inséré dans la table user_has_role ?

              Je pense que pour ça il serait plus facile d'utiliser des requêtes HQL avec Hibernate qui gèrent ça automatiquement sans que tu ais à réfléchir. (j'avais fait ça avec des catégories et des produits, faut juste que je vois ça ce soir en rentrant).

              Si je me souviens bien, il suffit de créer une classe "User" en classe mère et une classe "UserHasRole" qui en hérite puis de faire dans le DAO:

              UserHasRole e=newUserHasRole ();
               e.setRole(moderateur);
              save
              (e);

              Et le tour est joué, l'id du user est créé à travers la classe mère User et l'héritage va se matérialiser par une classe à part UserHasRole.

              Je décris à la louche, mais l'idée c'est ça globalement.

              Parce qu'en requêtes, il faudrait que tu fasses ton insertion de user, puis tu select ton user id pour refaire une insertion dans user_has_role.

              J'avais résolu ça, faut juste que je vois ça ce soir en rentrant.

              -
              Edité par Arkan100 16 janvier 2018 à 16:53:02

              • Partager sur Facebook
              • Partager sur Twitter
                16 janvier 2018 à 16:56:34

                Oui voilà c'est exactement ça, mais ici on peut pas vraiment utiliser de framework, ni d'ORM, du coup on doit bosser avec des requête :-/ ...

                Je vais encore effectuer des tests dans mon DAO, je trouve pas beaucoup d'info quant au fait d'utiliser 2 requêtes dans la même méthode, ou alors je m'y prend pas du tout de la bonne façon

                • Partager sur Facebook
                • Partager sur Twitter
                  16 janvier 2018 à 17:50:35

                  Une solution :

                  stmt = con.createStatement(); // Create a Statement object

                  stmt.executeUpdate( "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " + "IDENTCOL INTEGER GENERATED ALWAYS AS IDENTITY)"); // Create table with identity column
                  stmt.executeUpdate("INSERT INTO EMP_PHONE (EMPNO, PHONENO) " + 1 "VALUES ('000010', '5555')", // Insert a row
                  Statement.RETURN_GENERATED_KEYS); // Indicate you want automatically
                  // generated keys

                  rs = stmt.getGeneratedKeys(); // Retrieve the automatically 2
                  // generated key value in a ResultSet.
                  // Only one row is returned.
                  // Create ResultSet for query

                  while (rs.next()) {
                  java.math.BigDecimal idColVar = rs.getBigDecimal(1);
                  // Get automatically generated key
                  // value
                  System.out.println("automatically generated key value = " + idColVar);
                  }

                  rs.close(); // Close ResultSet
                  stmt.close(); // Close Statement

                  tu récupères la clé générée par ton insert et tu fais un second insert  dans ton DAO sur ta table user_has_role

                  Du coup tu ferais :

                              // get DB connection
                              myConn = dataSource.getConnection();
                              // create SQL for insert
                              String sql = "CALL insert_user(?,?,?,?,?,?)";
                              //String sql2 = "CALL insert_role_to_user(?,?)";
                   
                              myStmt = myConn.prepareStatement(sql);
                   
                              // set the param values for the user
                              myStmt.setString(1, user.getLastName());
                              myStmt.setString(2, user.getFirstName());
                              myStmt.setString(3, user.getEmail());
                              myStmt.setString(4, user.getLogin());
                              myStmt.setString(5, user.getHash());
                              myStmt.setBoolean(6, false);
                   
                              //myStmt.setInt(1, user.getId());
                              //myStmt.setInt(2, 3);
                   
                              // execute sql insert
                              myStmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

                  String key = myStmt.getGeneratedKey();



                  -
                  Edité par Arkan100 16 janvier 2018 à 18:02:26

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 janvier 2018 à 23:48:12

                    Merci Arkan100, je vais me pencher sur cette solution et voir ce que ça donne !:p
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 janvier 2018 à 7:04:40

                      Bonjour,

                      Il est fortement déconseillé de gérer les transactions au sein de tes procédures, celles-ci doivent être gérées en amont de telle sorte que c'est le code appelant qui décide des limites des transactions.

                      Car dans ton cas, si l'insertion dans la table user_has_role échoue tu te retrouves dans un état inconsistent, à savoir un user sans aucun rôle.

                      De plus dans ton exemple, tu as une procédure avec transaction, et l'autre sans.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 janvier 2018 à 7:54:23

                        Salut,

                        Merci du conseil JDesm, je vais régler ça, j'avais repris l'exemple du prof pour recréer les miennes, pas une bonne idée à priori :p.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Java EE inscription et attribution d'un rôle

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown