Спящий пустая коллекция в компоненте

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

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

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

<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( "статистика" ) возвращают ожидаемые значения.

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Может быть, это может помочь. Это не решает проблему различения пустого и пустого мешка, но это обходное решение. Как вы, возможно, знаете, вы можете ввести перехватчик для своей сессии, который может перехватывать определенные действия, такие как сохранение или обновление объектов, тогда вы можете использовать этот перехватчик, чтобы проверить состояние своего компонента, и если он пуст, снова введите его в null, чтобы hibernate выиграл ' t сохранить пустые значения. здесь документы.