гибернация пустая коллекция в компоненте - PullRequest
11 голосов
/ 07 мая 2010

У меня есть компонент, сопоставленный с помощью Hibernate. Если все поля в компоненте в базе данных равны нулю, сам компонент устанавливается в ноль с помощью 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 («статистика») возвращает ожидаемые значения.

Ответы [ 3 ]

1 голос
/ 16 августа 2011

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

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

0 голосов
/ 17 февраля 2012

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

0 голосов
/ 06 июля 2011

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

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

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

...