2010-05-07 3 views
10

У меня есть компонент, отображаемый с использованием Hibernate. Если все поля в компоненте в базе данных равны нулю, сам компонент имеет значение null в спящем режиме. Это ожидаемое поведение, а также то, что мне нужно.hibernate пустая коллекция в компоненте

Проблема, которую я имею, заключается в том, что когда я добавляю сумку к этому компоненту, сумка инициализируется пустым списком. Это означает, что компонент имеет ненулевое значение ... в результате создается компонент.

Любая идея, как исправить это?

<class name="foo.bar.Entity" table="Entity"> 
<id name="id" column="id"> 
    <generator class="native" /> 
</id> 

<property name="departure" column="departure_time" /> 
<property name="arrival" column="arrival_time" /> 

<component name="statistics"> 
    <bag name="linkStatistics" lazy="false" cascade="all" > 
     <key column="entity_id" not-null="true" /> 
     <one-to-many class="foo.bar.LinkStatistics" /> 
    </bag> 

    <property name="loggedTime" column="logged_time" /> 

    ... 
</component> 

критерия с Restirctions.isNull ("статистика") не возвращает ожидаемые значения.

+0

Пожалуйста, добавьте информацию о контексте: Кто устанавливает нулевой компонент? Какую составляющую вы говорите? Какой контейнер? –

+0

Aaron, Hibernate оставляет свойство компонента (статистика, в классе Entity) равным null. –

+0

Кажется, это довольно старая проблема, но у меня ее тоже нет, и я не нашел никакого решения. А вам повезло? – Martin

ответ

0

я не могу проверить это, но вот идея:

public void setListProperty(List list) { 
    if (list == null || list.size() == 0) { 
    this.listProperty = null; 
    } else { 
    this.listProperty = list; 
    } 
} 

Очевидно, не идеально, но может быть обходной путь для вас ...

+0

Этот подход действительно работает для вас? Из моего опыта такие трюки в сеттерах приводят к исключению «еще одна коллекция уже связана с сеансом» в Hibernate (потому что Hibernate будет помнить пустую коллекцию, которую он собирался связать с родительским сущностью). Таким образом, приведенный выше код будет работать, когда объект станет отсоединенным (сеанс, в который он был загружен, был закрыт), но в противном случае не будет. Использование 'null' в getter намного лучше :) –

1

Основная проблема здесь состоит в том, что Hibernate не может отличить между нулевыми коллекциями и пустыми коллекциями, поэтому он обрабатывает их как пустые: непустые.

Я предлагаю вам вместо этого заменить свой компонент Statistics на реальную сущность. Тогда ваш класс foo.bar.Entity имеет ссылку, которая может быть нулевой. Это не идеально, потому что вам нужно создать другую таблицу для хранения объекта Statistics, но если вы хотите пустое семантическое различие между пустым и пустым, это способ его получить.

+0

Исправить. Концепция сбора на самом деле не существует в СУБД, поэтому Hibernate (или любой ORM) должен делать что-то *. –

0

Возможно, это может помочь. Это не решает проблему различения пустого и пустого мешка, но это обходное решение. Как вы, возможно, знаете, вы можете ввести перехватчик на свой сеанс, который может перехватывать определенные действия, такие как сохранение или обновление объектов, тогда вы можете использовать этот перехватчик, чтобы проверить состояние своего компонента, и если он пуст, он снова пуст, чтобы спящий режим выиграл Не сохраняйте пустые значения. here Документы.

Смежные вопросы