Пустые или пустые коллекции в Hibernate - PullRequest
9 голосов
/ 21 сентября 2009

Скажем, у меня есть следующий класс с отображением Hibernate:

public class ClassA {       
   @OneToMany(fetch=EAGER)
   private List<ClassB> bList;
}

Когда я считываю объект ClassA из сеанса Hibernate, поле bList инициализируется объектом PersistentList, как и ожидалось.

У меня возникает требование, когда в ситуациях, когда список пуст, мне нужно, чтобы Hibernate инициализировал поле bList значением null, а не пустым PersistentList. Теоретически, Hibernate имеет информацию, необходимую для этого, так как выборка в списке не терпится. Проблема в том, что согласно разделу 6.1 документа Hibernate :

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

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

Ответы [ 3 ]

9 голосов
/ 21 сентября 2009

Вы пытались проверить метод getbList ()? Вы могли бы сделать:

if(bList.isEmpty()) 
    return null;
return bList;

Hibernate всегда будет создавать объект для ваших ссылок, но вы можете управлять данными внутри геттера и сеттера. Если в списке 0 элементов, вы всегда можете вернуть ноль.

2 голосов
/ 21 сентября 2009

Для обработки в вашем коде очевидный путь - в геттере, однако это не поможет вам, если вы хотите оценить его в HQL.

Две идеи:

  • Конструктор, который устанавливает его в NULL, если пустой.
  • A @PostLoad / @PostConstruct метод это делает то же самое.
2 голосов
/ 21 сентября 2009

Мне любопытно, почему вы считаете это «ограничением» - действительно ли значение NULL bList действительно означает для вашего приложения, чем пустое bList?

Я думаю, что в большинстве областей нулевая коллекция и пустая коллекция имеют одно и то же семантическое значение, и я думаю, именно поэтому разработчики Hibernate стремились ограничить использование Hibernate только одним. Не имеет смысла всегда проверять if (bList == null || bList.isEmpty), если оба всегда означают одно и то же.

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