Java,Hibernate Java.lang.ClassCastException:org.Hibernate.collection.PersistentSet不能强制转换为Java.util.HashSet

Java,Hibernate Java.lang.ClassCastException:org.Hibernate.collection.PersistentSet不能强制转换为Java.util.HashSet,java,hibernate,criteria,one-to-many,Java,Hibernate,Criteria,One To Many,我有两张桌子,DVD和Contact 一张DVD可以租给一个联系人,一个联系人可以租很多DVD 多对一链接(dvd-->联系人)工作正常 但另一种方法失败:(联系-->dvd) 这是联系人映射: <set name="dvds" inverse="true"> <key column="contactId"/> <one-to-many class="Dvd"/> </set> 异常是什么意思?如何修复它 编辑:这解决了我的问题: .

我有两张桌子,DVD和Contact

一张DVD可以租给一个联系人,一个联系人可以租很多DVD

多对一链接
(dvd-->联系人)
工作正常

但另一种方法失败:
(联系-->dvd)

这是联系人映射:

<set name="dvds" inverse="true">
   <key column="contactId"/>
   <one-to-many class="Dvd"/>
</set>
异常是什么意思?如何修复它

编辑:这解决了我的问题:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

不要试图将
集合
dds
强制转换为
哈希集合
。Hibernate使用自己的
Set
接口
PersistentSet
的实现,该接口不是从
HashSet
派生的,因此强制转换抛出
ClassCastException
。通过
Set
界面使用它,或者使用它的构造函数创建一个新的
HashSet
(在这种情况下,对集合的更改不会自动反映在Hibernate中)

设置tt=dds;

HashSet tt=新的HashSet(dds);

您不需要强制转换到
哈希集。它是一个
集合
,不提供任何附加方法。所以不要投

这是处理集合时的一般规则-不要用它们的具体类引用它们(除非您真的需要)。使用
List
Set
,而不是
ArrayList
HashSet

当然是正确的,但是建模中也存在错误


DVD和Contact之间的关系是多对多,而不是多对一(否则每个DVD对单个客户都是唯一的)

我最近遇到了这个问题。 我能够消除铸造问题

List listObject=Arrays.asList(ListFromHibernate.toArray())

然后,您可以通过在列表中强制转换对象来获取对象,例如

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


PS:2013年真是太可怕了。

不,dvd只能由一个用户租用@在给定时间对一个用户进行虚拟化,是的。但是,如果它只能由一个用户租用,那么你就误解了租用的概念。是的:)别担心,这是一个非常特殊的情况,一个用户可以租用dvd,当用户把它带回来时,字段联系人(在dvd的行上)设置为空,然后另一个用户可以租用:)同意Bozho的回答,想知道为什么你想把它转换成一个具体的类,-你需要做什么?提供了比
Set
更多的方法,例如
clone()
方法。我今天遇到了这个问题,现在需要手动创建克隆……这应该是正确的答案,因为它解决了另一条评论中指出的克隆()的不足。
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)
Set<Dvd> tt = dds;
HashSet<Dvd> tt = new HashSet<Dvd>(dds);