Я наследовал немного кода Java, который В спящем режиме использование. Некоторые люди, использующие этот код, теперь сообщают, что получают NullPointerExceptions повсеместно.
Я смог разыскать это и нашел, что, когда мы выполняем запрос, который вытягивает список объектов от базы данных, которая имеет список объектов (который вытягивают от другой таблицы) В спящем режиме, кажется, покидает дыры в списке (Нулевые значения). Таким образом, список может посмотреть что-то как:
Object
Object
NULL
Object
Код, который мы используем для вытаскивания информации из базы данных:
List<PrinterGroup> groups =
this.getSession().createQuery( "from PrinterGroup" ).list();
И затем в каждом PrinterGroup список Фильтров, которые имеют Нулевые значения в них.
В то время как я мог обойти и найти, что каждый экземпляр был, мы циклично выполняемся по этому списку и добавляем ПУСТУЮ проверку, я чувствую, что это - лейкопластырь, фиксируют, и должен быть способ сказать, в спящем режиме для не втягивания нулевых значений.
Править:
EDIT2:
Таким образом, база данных, казалось, сбивала с толку. PrinterGroup-> отношения Фильтра является связью "один ко многим". Таким образом, 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.
Сопоставлена ли эта коллекция с <списком>
(или другой индексированной коллекцией) и <списком-индексом>
?
Всем сопоставлениям коллекций, кроме тех, которые имеют семантику набора и мешка, нужен столбец индекса в таблице коллекции. Индексный столбец - это столбец, который отображается на индекс массива, или индекс списка, или ключ карты. ... Индекс массива или списка всегда имеет тип integer и сопоставляется с элементом. Сопоставленный столбец содержит последовательные целые числа, которые по умолчанию нумеруются с нуля".
Я полагаю, что при использовании индексированной коллекции, если ваш индексный столбец имеет пробелы (т.е. имеет значения типа 0
, 1
, 3
, 7
), то Hibernate заполнит результирующий List
пустыми элементами в ожидаемых местах.
Нужно либо проверять нули, либо переупорядочивать список, чтобы избавиться от нулей. Это мучение.
Как насчет простой фильтрации нулевых фильтров с помощью HQL
List<PrinterGroup> groups =
this.getSession().createQuery( "Select pg from PrinterGroup pg where pg.filter is not null" ).list();
Я предполагаю, что ваше свойство называется «фильтром»
List<PrinterGroup> groups = this.getSession().createCriteria( PrinterGroup.class ).add(Restrictions.isNotNull("filters")).list();
Хорошо, поэтому объекты PrinterGroup сами по себе не являются нулевыми, но у них есть нулевые ссылки на объекты типа 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 это будет непросто.
Если фильтр не может иметь значение NULL, исправьте данные, добавьте ограничение «not-NULL» к параметру «многие ко многим» и исправьте проверку ввода, чтобы предотвратить добавление дополнительных значений NULL.