我有两个表,用户和图片需要加入。 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但似乎不起作用。任何帮助都会很棒。谢谢!
答案 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是没有用的。