2011-10-12 4 views
1

Je suis nouveau sur Java EE, et j'ai mis en place un cas d'apprentissage où je peux enregistrer les utilisateurs et conserver les données dans la base de données, j'utilise Glassfish, EclipseLink JPA 2.0 et JSF. La base de données contient trois tables: user (id [pk], nom, genre, ...), hobby (id [pk], hobby_name), et user_hobby qui décrit la relation many-to-many et contient seulement user_id et hobby_id.persistance many-to-many

dans la classe d'entité User.java, je déclare la relation en tant que tel:

... 
@ManyToMany(fetch=FetchType.EAGER) 
@JoinTable(
    name="user_hobby", 
    [email protected](name="user_id"), 
    [email protected](name="hobby_id") 
) 
private List<Hobby> hobbies; 

public List<Hobby> getHobbies() { 
    return hobbies; 
} 

public void setHobbies(List<Hobby> hobbies) { 
    this.hobbies = hobbies; 
} 
... 

et dans la classe Hobby.java, je déclare bidirection en tant que tel:

... 
@ManyToMany(mappedBy="hobbies",fetch=FetchType.EAGER) 
private List<User> users; 

public List<User> getUsers() { 
    return users; 
} 

public void setUsers(List<User> users) { 
    this.users = users; 
} 
... 

Dans le JSF voir la page, je publie tous les passe-temps de la table de passe-temps qui contiennent des valeurs pré-insérées telles que:

<h:selectManyListbox id ="hobb" label="Hobbies" value="#{userController.user.hobbies}" > 
     <f:selectItems value="#{itemController.hobbyItems}"/> 
</h:selectManyListbox> 

et correspondant itemcontroller a cette méthode:

public List<SelectItem> getHobbyItems(){ 
    List<SelectItem> items=new ArrayList<SelectItem>(); 
    //fetch all hobbies from database 
    List<Hobby> hobbies=hobbyFacade.findAll(); 
    for(Hobby h:hobbies)items.add(new SelectItem(h,h.getHobby())); 
    return items; 
} 

Ici vous pouvez voir que j'injecter une liste des objets passe-temps dans la vue et de laisser user.hobbies se tenir là-dessus. Lorsque je crée des utilisateurs, si je ne sélectionne pas de passe-temps, la création réussit et les données sont conservées dans la base de données, mais si je sélectionne un passe-temps, le serveur renvoie une exception null, que je ne peux pas comprendre J'ai passé près d'une journée à déboguer, mais je n'ai pas pu progresser. Est-ce que quelqu'un pourrait m'aider à résoudre ce problème? Je l'apprécierais beaucoup. Si vous avez besoin de plus d'informations sur les paramètres, s'il vous plaît faites le moi savoir.

Mise à jour (exception trois premières lignes):

WARNING: java.lang.NullPointerException 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject(UnitOfWorkImpl.java:745) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObjects(UnitOfWorkImpl.java:4124) 
+0

La première ligne de la trace de pile de l'exception doit vous indiquer exactement à quelle ligne de code cette exception se produit. Nous montrer la trace de la pile nous aiderait à vous aider. –

+0

Salut, merci pour la réponse, en fait, il ne précise pas pourquoi l'exception se produit, il suffit de me dire nullpointerexception, s'il vous plaît se référer à la mise à jour. – bingjie2680

+0

A partir de la trace de votre pile, l'erreur est à 'org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject (UnitOfWorkImpl.java:745)' malheureusement, vous n'avez pas donné assez de lignes pour savoir quelle partie de votre code provoque cela. Fondamentalement, nous avons besoin de plus de votre trace de pile, au moins aussi loin que la première ligne qui commence par 'at' suivi du nom complet de l'une de vos classes. – Thor84no

Répondre

0

S'il vous plaît inclure votre code pour créer des utilisateurs qui est un échec et comprennent toute trace de la pile d'exception.

Ajoutez-vous une valeur nulle à une liste?

Assurez-vous d'utiliser les versions gérées des objets et de fusionner correctement vos objets.