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)
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
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With