【问题标题】:Java, Hibernate java.lang.ClassCastException: org.hibernate.collection.PersistentSet cannot be cast to java.util.HashSetJava, Hibernate java.lang.ClassCastException: org.hibernate.collection.PersistentSet 不能转换为 java.util.HashSet
【发布时间】:2011-01-03 12:24:23
【问题描述】:

我有两张桌子,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)

【问题讨论】:

  • 同意 Bozho 的回答,很想知道您为什么要将其转换为具体的类,-您需要这样做吗?

标签: java hibernate criteria one-to-many


【解决方案1】:

您无需转换为 HashSet。它是一个Set,它不提供任何额外的方法。所以不要施放。

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

【讨论】:

  • HashSet 确实提供了比Set 更多的方法,例如clone() 方法。我今天遇到了这个问题,现在需要手动创建我的克隆...
【解决方案2】:

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

Set<Dvd> tt = dds;

HashSet<Dvd> tt = new HashSet<Dvd>(dds);

【讨论】:

  • 这应该是正确的答案,因为它解决了另一条评论中指出的 clone() 缺失问题。
【解决方案3】:

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

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

【讨论】:

  • NONO dvd 只能由一个用户租用!
  • @vinise 在给定时间一个用户,是的。但如果它只能由一个用户租用,那你就误解了租用东西的概念。
  • yes :) 不用担心,这是一个非常特殊的情况,用户可以租用 dvd,当用户将其带回时,字段联系人(在 dvd 的行上)设置为 null ans 然后可以由其他用户租用:)
【解决方案4】:

我最近遇到了这个问题。 我能够根除选角问题。

List&lt;Object&gt; listObject = Arrays.asList(ListFromHibernate.toArray());

然后你可以通过将对象投射到 List 中来获取对象。

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

PS:2013 年太可怕了。

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2019-05-08
    • 2011-12-01
    相关资源
    最近更新 更多