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

gay*_*mer 5 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>
Run Code Online (Sandbox Code Playgroud)

这是联系人的setter getter:

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

public Set<Dvd> getDvds(){
   return dvds;
}
public void setDvds(Set<Dvd> dvds){
   this.dvds=dvds;
}
Run Code Online (Sandbox Code Playgroud)

当我试图从这个联系人那里租来DVD时:

HashSet<Dvd> tt = (HashSet<Dvd>)dds;
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:

java.lang.ClassCastException: org.hibernate.collection.PersistentSet 
cannot be cast to java.util.HashSet
Run Code Online (Sandbox Code Playgroud)

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

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

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 15

你不需要施展HashSet.它是一个Set,它不提供任何其他方法.所以就是不要施展.

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


Abh*_*kar 6

不要试图Set dds投入HashSet.Hibernate使用自己的Set接口实现,该接口PersistentSet不会派生HashSet,因此转换抛出a ClassCastException.可以通过Set接口使用它,也可以HashSet使用它的构造函数创建一个new (在这种情况下,对set的更改不会自动反映在Hibernate中).

Set<Dvd> tt = dds;
Run Code Online (Sandbox Code Playgroud)

要么

HashSet<Dvd> tt = new HashSet<Dvd>(dds);
Run Code Online (Sandbox Code Playgroud)