Hibernate返回null unitilzed Collection

时间:2010-10-27 15:42:32

标签: java hibernate

我有两个表,用户和图片需要加入。 users表中只有一个用户行与images表中的许多图像相对应。

在我的用户bean中,我有一个带有@OneToMany关系的私有Set变量,它看起来像这样

//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;
  }
}

然后我有一个UserImages bean,它存储了一堆数据,但是fk userId看起来像这样。

//UserImages.java

private Integer userId;

@Column(name = "user_id", updatable=true, nullable=false)
public Integer getUserId() {
    return userId;
}

public setUserId(Integer userId) {
    this.userId = userId;
}

我从DAO中调用getUserImage namedQuery来获取resultSet。

所以这种方法很有效,除非用户在UserImages表中没有图像。 (用户尚未上传任何图像)。我已经设置了一个测试来测试所有内容,如果用户有一个图像,它工作得很好,我可以调用用户的getImages()方法,它将返回一个集合,我可以迭代它。但是如果用户没有任何图像,它会立即给我一个空指针异常。

我试图在setUserImages()方法中将Set设置为null,如果变量this.images = null但似乎不起作用。任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

这不是你在Hibernate中做事的方式。使用ORM的重点在于您不必处理外键,而是使用对象引用:

@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;}

}

关于查询:请勿使用加入。使用这样的东西(我只使用JPA,所以我不确定HQL):

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

将用户对象和模式作为参数传递,让hibernate在内部进行连接。如果您打算自己做腿部工作,那么使用ORM是没有用的。