Java, Hibernate java.яз..ClassCastException: org.зимовать.коллекция.PersistentSet не может быть приведен к java.утиль.Для поиска HashSet


У меня есть два стола, 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

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

Edit: это решило мою проблему:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
4 4

4 ответа:

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

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

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

Set<Dvd> tt = dds;

Или

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

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

Связь между DVD и контактом-это отношение "многие ко многим", а не "многие к одному" (в противном случае каждый DVD был бы уникален для одного клиента)

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

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

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

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

PS: Это долбаный 2013 год.