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

Hibernate Java Discussion :

NullPointerException lors de l'ajout d'infos dans 2 tables liees en @ManyToMany


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut NullPointerException lors de l'ajout d'infos dans 2 tables liees en @ManyToMany
    Bonjour,

    Alors voila j'ai deux tables "Person" et "Phone" qui sont liees par le biai d'une cle externe pour chacune.

    Une persone peut avoir plusieurs num de telephone et inversement. J'ai donc des annotations de type @ManyToMany pour les 2 et je rajoute mon "mappedBy" dans la classe Phone.

    L'utilisateur sera ammene a entrer des infos propre a la table Person et son numero de telephone qui sera propre a la classe Phone.
    Donc lors de la validation des infos entree, mon action cree une personne (new Person()), ajoute les infos dedans, fait de meme avec Phone et ensuite je gere le lien en recuperant ma liste de personne de Phone auquel j'ajoute ma personne actuelle (ph.getPersonPhone().add(p); et ca me fait rentrer dans l'exception ).




    Ca devrait marcher mais lors de l'execution je rentre dans l'execption JavaNullPointer Exception.

    Donc voila je ne comprends pas du tout ce qui ne va pas.

    Voici la partie pertinente de mon code pour illustrer :

    Person :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    @Entity
    public class Person implements Serializable {
        private static final long serialVersionUID = 1L;
        private Long id;
        private String forename;
        private String surname;
        private String username;
        private String password;
        private Set<Phone> phone;
     
        @ManyToMany
        public Set<Phone> getPhone() {
            return phone;
        }
     
        public void setPhone(Set<Phone> phone) {
            this.phone = phone;
        }
     
    public void setForename(String forename) {
            this.forename = forename;
        }
     
        public void setPassword(String password) {
            this.password = password;
        }
     
        public void setSurname(String surname) {
            this.surname = surname;
        }
     
        public void setUsername(String username) {
            this.username = username;
        }
     
        @Column
        public String getForename() {
            return forename;
        }
     
        @Column
        public String getPassword() {
            return password;
        }
     
        @Column
        public String getSurname() {
            return surname;
        }
     
        @Column
        public String getUsername() {
            return username;
        }
     
        public void setId(Long id) {
            this.id = id;  
        }
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        public Long getId() {
            return id;
        }
     
       ...
    Phone :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    @Entity
    public class Phone implements Serializable {
        private static final long serialVersionUID = 1L;
        private Long id;
        private String number;
        private Set<Person> personPhone;
     
        @ManyToMany(mappedBy="phone")
        public Set<Person> getPersonPhone() {
            return personPhone;
        }
     
        public void setPersonPhone(Set<Person> person) {
            this.personPhone = person;
        }
     
     
     
        public void setNumber(String number) {
            this.number = number;
        }
     
        @Column
        public String getNumber() {
            return number;
        }
     
        public void setId(Long id) {
            this.id = id;
        }
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        public Long getId() {
            return id;
        }
     
       ...
    RegisterService :

    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
    22
    23
    24
    25
    26
    27
    28
    29
     
    public void InsertPerson(String forename, String surname, String username, String password, String number) throws BusinessException {
            try {
                EntityManager em = EntityUtil.getEntityManager("SUMSPU");
                em.getTransaction().begin();
     
                //Add a person
                Person p = new Person();
                em.persist(p);
                p.setForename(forename);
                p.setSurname(surname);
                p.setUsername(username);
                p.setPassword(password);
     
     
                //Add the phone number of the person            
                Phone ph = new Phone();
                em.persist(ph);
                ph.setNumber(number);
     
                ph.getPersonPhone().add(p); // ICI JE RENTRE DANS L'EXCEPTION
     
     
                em.getTransaction().commit();
     
            } catch (Exception e) {
                throw new BusinessException("testFunction failed :"+e,e);
            }
        }
    RegisterAction :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    public class RegisterAction extends ActionSupport{
     
        private String forename;
        private String surname;
        private String username;
        private String password;
        private String phone;
     
     
     
        public String getPhone() {
            return phone;
        }
     
        public void setPhone(String phone) {
            this.phone = phone;
        }
     
     
        public void setForename(String forename) {
            this.forename = forename;
        }
     
        public void setPassword(String password) {
            this.password = password;
        }
     
        public void setSurname(String surname) {
            this.surname = surname;
        }
     
        public void setUsername(String username) {
            this.username = username;
        }
     
        public String getForename() {
            return forename;
        }
     
        public String getPassword() {
            return password;
        }
     
        public String getSurname() {
            return surname;
        }
     
        public String getUsername() {
            return username;
        }
     
        @Override
        public String execute() throws Exception {
            //Default login mechanism is to allow the user in
            try{
                RegisterService rs = new RegisterService();
                rs.InsertPerson(this.getForename(), this.getSurname(), this.getUsername(), this.getPassword(), this.getPhone());
                return SUCCESS;
            }catch (Exception e) {
                return ERROR;
            }
        }
    Voila, merci de m'aider

    Andreas
    "La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !" -Albert Einstein

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    On voit pas le bout de code qui fait l'objet de l'exception.
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  3. #3
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, il faut que tu donnes les traces de l'exception pour savoir d'où elle vient.
    Sinon au hasard ça pourrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EntityManager em = EntityUtil.getEntityManager("SUMSPU");
    qui renvoit null

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    Le bout de code qui produit l'exception est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ph.getPersonPhone().add(p); // ICI JE RENTRE DANS L'EXCEPTION
    comme indique dans mon premier post.

    Pour ce qui est de l'EntityManager, lorsque j'effectue un ajout d'information entre par exemple deux tables Person et Email qui ont comme annotations @ManyToOne et @OneToMany ca fonctionne parfaitement.

    Comme par exemple ceci fonctionne :

    RegisterService :

    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
    22
    23
    24
    25
    26
     
    public void InsertPerson(String forename, String surname, String username, String password, String address) throws BusinessException {
            try {
                EntityManager em = EntityUtil.getEntityManager("SUMSPU");
                em.getTransaction().begin();
     
                //Add a person
                Person p = new Person();
                em.persist(p);
                p.setForename(forename);
                p.setSurname(surname);
                p.setUsername(username);
                p.setPassword(password);
     
                //Add the email address of the person
                Email el = new Email();
                em.persist(el);
                el.setAddress(address);
                el.setPersonEmail(p);
     
                em.getTransaction().commit();
     
            } catch (Exception e) {
                throw new BusinessException("testFunction failed :"+e,e);
            }
        }
    Donc je ne pense pas que cela vienne de l'EntityManager.
    J'avais egalement fait un debug et c'est vraiment avec l'instruction "ph.getPersonPhone().add(p);" que je rentre dans l'exception.

    La ou ca ne fonctionne pas c'est lorsque je me retrouve avec des annotations @ManyToMany dans deux tables (ce qui cree au niveau SQL une table de relation en plus, compose des cles externes des deux tables en tant que cle primaire)

    C'est dans ce cas la que je rentre dans l'exception.
    "La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !" -Albert Einstein

  5. #5
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Set<Person> personPhone;
    Tu n'as pas initialisé personPhone, il est donc null quand tu fais le getPersonePhone.

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    J'ai initialise tous mes Set et j'ai toujours la meme exception
    "La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !" -Albert Einstein

  7. #7
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Comment l'as-tu initialisé?

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    Autant pour moi, j'avais oublie de nettoyer maintenant ca marche

    Je l'ai iniatilise avec un new HashSet.

    Merci beaucoup.

    Cependant, c'est bizarre parce que je n'ai rien dans ma table de relation "Person_Phone" compose de personPhone_id et phone_id pourtant je devrais non ? Les deux autres tables se remplissent normalement.
    "La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !" -Albert Einstein

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    C'est bon finalement ca fonctionne, j'avais oublie d'ajouter le telephone a la liste de telephone de la personnne.

    Pour les futurs personnes qui auraient le meme probleme, la fonction du RegisterService doit ressembler a cela :

    RegisterService :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public void InsertPerson(String forename, String surname, String username, String password, String address, String number) throws BusinessException {
            try {
                EntityManager em = EntityUtil.getEntityManager("SUMSPU");
                em.getTransaction().begin();
     
                //Add a person
                Person p = new Person();
                em.persist(p);
                p.setForename(forename);
                p.setSurname(surname);
                p.setUsername(username);
                p.setPassword(password);
     
     
     
                //Add the email address of the person
                Email el = new Email();
                em.persist(el);
                el.setAddress(address);
                el.setPersonEmail(p);
     
     
     
                //Add the phone number of the person            
                Phone ph = new Phone();
                em.persist(ph);
                ph.setNumber(number);
     
                ph.getPersonPhone().add(p);
                p.getPhone().add(ph); // LIGNE AJOUTEE QUI ASSURE UN BON FONCTIONNEMENT
     
     
                em.getTransaction().commit();
                em.close();
     
            } catch (Exception e) {
                throw new BusinessException("testFunction failed :"+e,e);
            }
        }
    "La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !" -Albert Einstein

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

Discussions similaires

  1. [PHP 5.2] Ajout d'infos dans une liste et rafraîchissement
    Par jep33 dans le forum Langage
    Réponses: 14
    Dernier message: 19/05/2009, 14h27
  2. Réponses: 3
    Dernier message: 02/12/2008, 13h29
  3. Problème d'ajout d'infos dans un fichier
    Par Munkey74 dans le forum Langage
    Réponses: 11
    Dernier message: 05/06/2007, 16h10
  4. Ajouter un champ dans une table liee
    Par jojoboloss dans le forum Access
    Réponses: 1
    Dernier message: 29/01/2007, 14h46
  5. Réponses: 3
    Dernier message: 08/10/2005, 14h57

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