Почему мой метод get «один ко многим» Hibernate возвращает пустую коллекцию? - PullRequest
0 голосов
/ 19 марта 2011

Я установил двустороннее отношение «один ко многим» / «многие к одному» для класса User и класса Pet (для академического веб-проекта на тему зоомагазина). Каждый пользователь владеет коллекцией домашних животных.

Кажется, что отношения работают нормально, потому что когда я выполняю запрос, чтобы выбрать первого пользователя в моей базе данных в браузере запросов HQL NetBeans, я вижу, что атрибут "Pets" имеет 2 идентификатора объекта Java в списке, предположительно два домашние животные, на которых я ссылаюсь через внешний ключ ( [HibernateBeans.Pet@76838e, HibernateBeans.Pet@b71950] ).

Удивительно (и неправильно), мой код ниже возвращает пустую коллекцию, когда я передаю точно того же пользователя, к которому я успешно запросил:

public ArrayList<Pet> getPets(User user) {
    Set<Pet> pets = null;
    try {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        pets = user.getPets();
        for (Pet p : pets) System.out.println(p.getPetName());
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    return pets;
}

EDIT : Согласно советам Тахира, я удалил аннотации из своих классов Java и теперь строго использую отображение POJO XML (но та же проблема сохраняется). Мой исходный код ниже был соответствующим образом обновлен:

Вот соответствующие отображения XML Hibernate:

User.hbm.xml:

<set name="pets" inverse="true">
    <key>
        <column name="UserID" not-null="true" />
    </key>
    <one-to-many class="HibernateBeans.Pet"/>
</set>

Pet.hbm.xml:

<many-to-one name="user" class="HibernateBeans.User" fetch="select">
        <column name="UserID" not-null="true" />
</many-to-one>

Любая помощь по этому вопросу будет принята с благодарностью. Хотя я впервые публикую вопрос, StackOverflow спас мне жизнь на много поводе.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Кроме того, чтобы сохранить коллекцию домашних животных при сохранении объекта пользователя, вам нужно сделать каскадный атрибут в сопоставлении «один ко многим» со «всем». Это указано ниже.

<set name="pets" inverse="true" cascade="all" lazy="false">    
   <key column name="UserID" not-null="true" />   
   <one-to-many class="HibernateBeans.Pet"/> 
</set> 

Попробуйтеэто может сработать.

0 голосов
/ 19 марта 2011

Используете ли вы и XML, и отображение на основе аннотаций в одном проекте? Я бы порекомендовал использовать один метод (в вашем случае аннотации).

Ваша XML-версия сопоставления не объявляет User.pets как загруженное свойство. Это может быть причиной того, что вы видите пустой список.

EDIT:

Поскольку проблема по-прежнему возникает после переключения только на сопоставления xml, я предлагаю попробовать следующее:

  1. Убедитесь, что вы получили объект User из спящего режима и не созданы с ключевым словом new
  2. Попробуйте объявить User.pets как загруженные с помощью lazy="false" в вашем отображении
  3. Вызов user.getPets () сразу после загрузки пользователя (т.е. без закрытия сеанса, который загрузил пользователя) (см. # 1)

Пункты 2 и 3 предназначены только для того, чтобы дать вам преимущество в отладке. Учитывая, что вы не жадно загружаете pets, любая попытка вызвать user.getPets() после закрытия исходного сеанса должна привести к org.hibernate.LazyInitializationException.

EDIT:

Еще одна вещь, которую нужно проверить, это то, что вы не присваиваете значение полю User.pets вручную. Hibernate предоставляет настраиваемую реализацию коллекций для обеспечения отложенной инициализации.

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