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

放肆的年华 提交于 2019-12-12 10:56:22

问题


I have two tables, DVD and Contact.

A DVD can be rented to a contact and a contact can rent many DVD's.

The many to one link (dvd-->contact) works fine.

But the other way fails: (contact-->dvd)

This is the contact mapping:

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

Here is setter getter for Contact:

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

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

When I try to get the DVD rented from a contact with this:

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

I get an Exception:

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

What does the Exception mean and how do I fix it?

Edit: This solved my problem:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

回答1:


You don't need to cast to HashSet. It is a Set, and it does not provide any additional methods. So just don't cast.

This is a general rule when working with collections - don't refer to them with their concrete classes (unless you really need to). Use List and Set, rather than ArrayList and HashSet




回答2:


Don't try to cast the Set dds into HashSet. Hibernate uses its own implementation of the Set interface called PersistentSet which does not derive from HashSet and hence the casting throws a ClassCastException. Either use it through the Set interface, or create a new HashSet using its constructor (in which case your changes to the set will not be reflected in Hibernate automatically).

Set<Dvd> tt = dds;

OR

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



回答3:


Abhinav Sarkar's answer is correct of course, but there is also a mistake in your modeling.

The relationship between DVD and Contact is Many-To-Many, not Many-To-One (otherwise each DVD would be unique to one single customer)




回答4:


I've come across this problem recently. I was able to eradicate the casting problem.

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

Then you can get the objects by casting the objects in List, say.

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

PS: It's freaking 2013.



来源:https://stackoverflow.com/questions/4584388/java-hibernate-java-lang-classcastexception-org-hibernate-collection-persisten

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!