Hibernate вставляет значения NULL в список - PullRequest
11 голосов
/ 16 июля 2010

Я унаследовал немного кода Java, который использует Hibernate.Некоторые из людей, использующих этот код, теперь сообщают, что повсеместно получают исключения NullPointerException.

Я смог отследить это и обнаружил, что когда мы выполняем запрос, который извлекает список объектов из базы данных, который имеет список объектов (которые извлекаются из другой таблицы), Hibernate кажетсяоставлять дыры в списке (значения NULL).Таким образом, список может выглядеть примерно так:

Object
Object
NULL
Object

Код, который мы используем для извлечения информации из базы данных:

List<PrinterGroup> groups = 
    this.getSession().createQuery( "from PrinterGroup" ).list();

И затем внутри каждой группы принтеров есть списокФильтры со значениями NULL в них.

Хотя я мог бы обойти и найти каждый экземпляр, где мы перебираем этот список и добавить проверку NULL, я чувствую, что это исправление ошибки, и должен быть способсказать Hibernate не тянуть нулевые значения в.

EDIT:

  • Мы используем Hibernate 3.2.2

EDIT2:

Таким образом, база данных казалась запутанной.Отношение PrinterGroup -> Filter является отношением один ко многим.Таким образом, у PrinterGroups есть список фильтров.Проблема заключается в том, что список фильтров содержит нулевые значения, когда он выходит из базы данных (кстати, в базе данных нет нулевых значений), а список выглядит так, как указано выше.

EDIT3:

Вот релятивистский picese для отображения в PrinterGroup HBM

<subclass name="PrinterGroup" discriminator-value="PG">
   <list name="filters"
              lazy="true"
              table="PG_FILTER"
               inverse="false"
                cascade="all-delete-orphan">

        <key>
           <column name="PG_ID" not-null="false"/>
        </key>
        <index column="LISTPOSITION"/>
        <one-to-many class="Filter"/>
     </list>

А фильтр - довольно простое отображение POJO.

Ответы [ 5 ]

17 голосов
/ 17 июля 2010

Отображается ли эта коллекция с <list> (или другой проиндексированной коллекцией) и <list-index>?

Все сопоставления коллекций, кроме тех, которые имеют семантику set и bag, нуждаются в столбце индекса в таблице сбора. Столбец индекса - это столбец, который сопоставляется с индексом массива или индексом списка или ключом карты. ... Индекс массива или списка всегда имеет тип integer и отображается с использованием элемента. Отображенный столбец содержит последовательные целые числа, которые по умолчанию пронумерованы от нуля.

Я бы предположил, что при использовании индексированной коллекции, если в столбце индекса есть пробелы (т. Е. В нем есть такие значения, как 0, 1, 3, 7), Hibernate будет заполнять результирующий List с пустыми элементами в ожидаемых местах.

2 голосов
/ 16 июля 2010
List<PrinterGroup> groups = this.getSession().createCriteria( PrinterGroup.class ).add(Restrictions.isNotNull("filters")).list();
1 голос
/ 16 июля 2010

Хорошо, значит, объекты PrinterGroup сами по себе не равны NULL, но у них есть нулевые ссылки на объекты типа Filter?Или ненулевые ссылки на списки фильтров, которые содержат нулевые фильтры?

Очевидный ответ заключается в том, что база данных содержит отношение «многие ко многим» между PrinterGroup и Filter и содержит нулевые значения базы данных для фильтров, например::

 select * from printer_group_filter;
 id    printergroup_id   filter_id
 1     1                1
 2     1                null
 3     1                2
 4     2                1
 5     2                null

Если фильтр может быть нулевым, это ваше требование.Или же вы можете использовать идиому NullObject, чтобы сделать «нулевой фильтр» реальным объектом, хотя с Hibernate это не будет простым делом.

Если фильтр не может быть нулевым, исправьте ваши данныедобавьте ограничение «не ноль» для «многие ко многим» и исправьте проверку входных данных, чтобы предотвратить добавление дополнительных нулей.

0 голосов
/ 16 июля 2010

Как насчет простой фильтрации пустых фильтров с использованием HQL

List<PrinterGroup> groups = 
    this.getSession().createQuery( "Select pg from PrinterGroup pg where pg.filter is not null" ).list();

Я предполагаю, что ваше свойство называется 'filter'

0 голосов
/ 16 июля 2010

Вы должны либо проверить нуль, либо вам нужно изменить порядок в списке, чтобы избавиться от ноля.Это боль.

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