Hibernate возвращает ноль Unililized Коллекция - PullRequest
0 голосов
/ 27 октября 2010

У меня есть две таблицы, пользователи и изображения, которые необходимо объединить.в таблице пользователей есть ровно одна строка пользователя для множества изображений в таблице изображений.

В моем пользовательском компоненте у меня есть приватная переменная Set с отношением @OneToMany, она выглядит следующим образом

//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, который хранит кучу данных, но имеет 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;
}

Я вызываю getUserImage namedQuery из моего DAO, чтобы получить resultSet.

Так что это работает хорошо, за исключением случаев, когда у пользователя НЕТ изображений в таблице UserImages.(Пользователь еще не загрузил ни одного изображения).Я настроил тест для проверки всего, и если у пользователя есть изображение, оно отлично работает, я могу вызвать метод getImages () для пользователя, и он вернет набор, и я смогу пройти через это.Но если у пользователя нет изображений, он сразу дает мне исключение нулевого указателя.

Я попытался установить для параметра Set значение null в методе setUserImages (), если переменная this.images = null, но это, похоже, не работает.Любая помощь будет отличной.Спасибо!

1 Ответ

1 голос
/ 27 октября 2010

Это не так, как вы делаете вещи в 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, если вы собираетесь самостоятельно выполнять работу на ногах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...