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 ответа:
Вам не нужно приводить к
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 был бы уникален для одного клиента)