Java, Hibernate java.lang.ClassCastException: org.hibernate.collection.PersistentSet не может быть приведен к java.util.HashSet - PullRequest
4 голосов
/ 03 января 2011

У меня есть две таблицы, DVD и контакт.

DVD можно арендовать для контакта, и контакт может арендовать множество DVD.

Ссылка "многие на одну" (dvd-->contact) отлично работает.

Но другой путь терпит неудачу: (contact-->dvd)

Это отображение контактов:

<set name="dvds" inverse="true">
   <key column="contactId"/>
   <one-to-many class="Dvd"/>
</set>

Вот установщик геттер для контакта:

private Set<Dvd> dvds = new HashSet<Dvd>();

public Set<Dvd> getDvds(){
   return dvds;
}
public void setDvds(Set<Dvd> dvds){
   this.dvds=dvds;
}

Когда я пытаюсь взять напрокат DVD от контакта с этим:

HashSet<Dvd> tt = (HashSet<Dvd>)dds;

Я получаю исключение:

java.lang.ClassCastException: org.hibernate.collection.PersistentSet 
cannot be cast to java.util.HashSet

Что означает исключение и как его исправить?

Редактировать: Это решило мою проблему:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

Ответы [ 4 ]

15 голосов
/ 03 января 2011

Вам не нужно приводить к HashSet. Это Set, и он не предоставляет никаких дополнительных методов. Так что просто не бросайте.

Это общее правило при работе с коллекциями - не называйте их конкретными классами (если только вам это не нужно). Используйте List и Set, а не ArrayList и HashSet

6 голосов
/ 03 января 2011

Не пытайтесь бросить Set dds в HashSet. Hibernate использует свою собственную реализацию Set интерфейса, называемого PersistentSet, который не является производным от HashSet, и, следовательно, приведение приводит к ClassCastException. Либо используйте его через интерфейс Set, либо создайте новый HashSet, используя его конструктор (в этом случае ваши изменения в наборе не будут отражены в Hibernate автоматически).

Set<Dvd> tt = dds;

OR

HashSet<Dvd> tt = new HashSet<Dvd>(dds);
1 голос
/ 20 июня 2013

Я недавно столкнулся с этой проблемой. Мне удалось устранить проблему с кастингом.

List<Object> listObject = Arrays.asList(ListFromHibernate.toArray());

Затем вы можете получить объекты, приведя объекты в List, скажем.

MyObject x = (MyObject) listObject.get(1);

PS: Это чертовски 2013 год.

1 голос
/ 03 января 2011

Ответ Абхинава Саркара , конечно, верен, но в моделировании также есть ошибка.

Отношения между DVD и Контактом «многие-ко-многим», а не «многие-к-одному» (иначе каждый DVD-диск будет уникальным для одного покупателя)

...