2011-01-03 7 views
4

私は2つのテーブル、DVDと連絡先を持っています。Java、Hibernate java.lang.ClassCastException:org.hibernate.collection.PersistentSetはjava.util.HashSetにキャストできません

DVDは連絡先に借りることができ、連絡先は多くのDVDを借りることができます。

多対1のリンク(dvd-->contact)はうまく動作します。

しかし、他の方法が失敗します。私はDVDを借りて取得しようとすると

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

public Set<Dvd> getDvds(){ 
    return dvds; 
} 
public void setDvds(Set<Dvd> dvds){ 
    this.dvds=dvds; 
} 

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

連絡用セッターゲッターです:(contact-->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

をおかしくなり、あなたは具体的なクラスに変換したい理由を知りたい、Bozhoの答えに同意します - それを行うためにあなたの必要性は何でしたか? –

答えて

14

あなたはHashSetにキャストする必要はありません。 Setであり、追加の方法は提供していません。だからキャストしないでください。

これは、コレクションを扱うときの一般的な規則です。具体的なクラスを参照することはありません(本当に必要な場合を除きます)。 ListSetを使用して、というよりもArrayListHashSet

+1

['HashSet'](https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html)は、' Set'以外のメソッドを提供しています。例えば、 'clone() 'メソッド。私は今日この問題に遭遇し、手動で私のクローンを手動で作成する必要があります... – Draken

4

HashSetSetddsをキャストしようとしないでください。 HibernateはHashSetから派生しないPersistentSetと呼ばれるSetインターフェイスの独自の実装を使用し、したがってキャストはClassCastExceptionをスローします。 Setインターフェイスで使用するか、そのコンストラクタを使用して新しいHashSetを作成します(この場合、セットへの変更は自動的にHibernateに反映されません)。

Set<Dvd> tt = dds; 

OR

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

これは、別のコメントで指摘されているclone()の欠如に対処するための正解です。 – Serge

1

Abhinav Sarkar's answerはもちろん正しいですが、間違いがあなたのモデルでもあります。

DVDと連絡先との関係は、多対多、多対一ではない(それ以外の場合は、各DVDには1人の顧客に固有のものである)

+0

NONOのDVDは1人の唯一のユーザーによって借りることができます! – gaymer

+0

@viniseある時間に1人のユーザー、はい。しかし、これまでに一人のユーザーだけが借りることができれば、あなたは何かを借りるという概念を誤解していました。 –

+0

はい:非常に特殊なケースを心配しないでください DVDはユーザーによって借りることができ、ユーザーがそれを戻すと(DVDの行にある)フィールドの連絡先はnullに設定されます。ユーザー:) – gaymer

1

私は最近、この問題に遭遇してきましたです。 キャスティングの問題を根絶することができました。

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

次にあなたがリスト内のオブジェクトをキャストすることによって、オブジェクトを取得することができ、と言います。

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

PS:それは2013年

+0

これも私のために働いた。ありがとう – usmanwalana

関連する問題