Java,Hibernate java.lang.ClassCastException:org.hibernate.collection.PersistentSet无法强制转换为java.util.HashSet

时间:2011-01-03 12:24:24

标签: java hibernate criteria one-to-many

我有两张桌子,DVD和联系人。

可以将DVD租给联系人,联系人可以租用许多DVD。

多对一链接(dvd-->contact)正常工作。

但另一种方式失败了:(contact-->dvd)

这是联系人映射:

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

以下是联系人的setter getter:

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

异常是什么意思,我该如何解决?

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

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

4 个答案:

答案 0 :(得分:15)

您无需转发HashSet。它是Set,它不提供任何其他方法。所以就是不要施展。

这是处理集合时的一般规则 - 不要用它们的具体类来引用它们(除非你真的需要)。使用ListSet,而不是ArrayListHashSet

答案 1 :(得分:6)

请勿尝试将Set dds投射到HashSet。 Hibernate使用自己的名为Set的{​​{1}}接口实现,该接口不是从PersistentSet派生的,因此转换会抛出HashSet。可以通过ClassCastException接口使用它,也可以使用其构造函数创建一个新的Set(在这种情况下,您对该集的更改不会自动反映在Hibernate中)。

HashSet

OR

Set<Dvd> tt = dds;

答案 2 :(得分:1)

Abhinav Sarkar's answer当然是正确的,但你的建模中也存在错误。

DVD和联系人之间的关系是多对多,而不是多对一(否则每张DVD对于一个客户来说都是唯一的)

答案 3 :(得分:1)

我最近遇到过这个问题。 我能够根除铸造问题。

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

然后你可以通过在List中转换对象来获取对象,比如说。

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

PS:它在2013年岌岌可危。