我有两张桌子,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)
答案 0 :(得分:15)
您无需转发HashSet
。它是Set
,它不提供任何其他方法。所以就是不要施展。
这是处理集合时的一般规则 - 不要用它们的具体类来引用它们(除非你真的需要)。使用List
和Set
,而不是ArrayList
和HashSet
答案 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年岌岌可危。