2010-10-27 11 views
0

J'ai deux tables, utilisateurs et images qui doivent être jointes. il y a exactement une ligne d'utilisateur dans la table des utilisateurs pour beaucoup d'images dans la table d'images.Hibernate renvoie null unitilzed Collection

Dans mes utilisateurs haricots J'ai une variable Set privée avec une relation de @OneToMany il ressemble à ce

//Users.java 
@Entity 
@Table(name = "users") 
@NamedQueries ({ 
@NamedQuery(name = "Users.getUserImage", 
query("from Users as users INNER JOIN fetch users.images as image WHERE users.userId image.userId AND users.userId =: passedId") 
}) 
public class Users 
    private Set<UserImages> images; 

    @OneToMany(mappedBy = "userId", fetch = FetchType.LAZY, cascade=CascadeType.ALL) 
    public Set<UserImages> getImages() { 
     return images; 
    } 

    public void setImages(Set<UserImages> images) { 
     this.images = images; 
    } 
} 

J'ai un haricot userimages qui stocke un tas de données, mais a le userId fk qui ressemble à alors. J'appelle getUserImage namedQuery à partir de mon DAO pour obtenir le resultSet. J'appelle getUserImage namedQuery. Cela fonctionne donc bien, sauf lorsqu'un utilisateur n'a AUCUNE image dans la table UserImages.

(L'utilisateur n'a pas encore téléchargé d'images). J'ai mis en place un test pour tester tout et si un utilisateur a une image cela fonctionne très bien, je peux appeler la méthode getImages() sur un utilisateur et il retournera un ensemble et je peux itérer à travers cela. Mais si l'utilisateur n'a aucune image, il me donne une exception de pointeur nul tout de suite.

J'ai essayé de définir Set à null dans la méthode setUserImages() si la variable this.images = null mais cela ne semble pas fonctionner. Toute aide est la bienvenue. Merci!

Répondre

1

Ce n'est pas comme ça qu'on fait des choses dans Hibernate. Le point entier d'utiliser un ORM est que vous ne devez pas traiter avec les clés étrangères, mais avec des références d'objet:

@Entity 
public class UserImage{ 

    @ManyToOne 
    private User user; 

    public User getUser(){return user;} 
    public setUser(User user){this.user = user;} 

} 

@Entity 
public class User{ 

    @OneToMany(mappedBy="user") 
    private Set<UserImage> images; 

    public void setImages(Set<UserImage> images){this.images=images;} 
    public Set<UserImage> getImages(){return this.images;} 

} 

A propos des requêtes: ne pas utiliser jointure. Utilisez quelque chose comme ça (je ne l'utilise JPA, donc je ne suis pas sûr de HQL):

Select i from UserImage i where user = :user and filename like :pattern 

passer l'objet utilisateur et le modèle en tant que paramètre et Hibernate faire la jointure interne. Il ne sert à rien d'utiliser un ORM, si vous devez vous-même faire les jambes.

+0

Merci pour votre réponse, mais cela me rend confus Je ne traite pas avec une clé étrangère, ma classe Users contient une variable privée Set qui stocke l'ensemble des objets UserImage qui sont associés à cet utilisateur. Je suis nouveau à ce sujet mais à partir de ce que vous avez écrit il semble que vous voulez que je stocke un ID utilisateur dans la classe UserImages? Je présume que l'utilisateur utilisateur privé doit être un utilisateur privé userId? – HiberNATHAN

+0

Non, vous n'avez pas affaire à une clé étrangère. Votre base de données traite avec une clé étrangère et Hibernate aussi. Vous avez affaire à une référence d'objet qui est automatiquement mappée à une clé étrangère. –

+0

ok, donc je suppose que ce qui me consomme est cet utilisateur utilisateur privé, voulez-vous vraiment dire UserImages userId privé; le champ que j'utilise la notation mappedBy pour? – HiberNATHAN