Java, Hibernate java.lang.ClassCastException: org.mise en veille prolongée.collection.PersistentSet ne peut pas être lancé à java.util.HashSet
J'ai deux tables, de DVD et de Contact.
Un DVD peut être loué pour un contact et un contact peut louer de nombreux DVD.
Nombreux à un lien (dvd-->contact)
fonctionne très bien.
Mais dans l'autre sens échoue: (contact-->dvd)
C'est le contact de la cartographie:
<set name="dvds" inverse="true">
<key column="contactId"/>
<one-to-many class="Dvd"/>
</set>
Ici est de poseur de lecture pour nous Contacter:
private Set<Dvd> dvds = new HashSet<Dvd>();
public Set<Dvd> getDvds(){
return dvds;
}
public void setDvds(Set<Dvd> dvds){
this.dvds=dvds;
}
Lorsque j'essaie d'obtenir le DVD loués à partir d'un contact avec ceci:
HashSet<Dvd> tt = (HashSet<Dvd>)dds;
J'obtiens une Exception:
java.lang.ClassCastException: org.hibernate.collection.PersistentSet
cannot be cast to java.util.HashSet
Ce n'est l'Exception, et comment dois-je faire?
Edit: Cela a résolu mon problème:
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
D'accord avec Bozho réponse, curieux de savoir pourquoi vous voulez convertir à un béton de classe, - quelle a été votre besoin de faire cela?
OriginalL'auteur gaymer | 2011-01-03
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de jeter à
HashSet
. C'est unSet
, et il ne fournit pas d'autres méthodes. Donc il suffit de ne pas exprimés.C'est une règle générale lorsque l'on travaille avec des collections - ne pas se référer à eux avec leurs classes concrètes (à moins que vous vraiment besoin). Utilisation
List
etSet
, plutôt que deArrayList
etHashSet
HashSet
ne fournissent plus de méthodes queSet
, un exemple est laclone()
méthode. J'ai rencontré ce problème aujourd'hui et le besoin de créer manuellement mon clone maintenant...OriginalL'auteur Bozho
N'essayez pas de lancer le
Set
dds
enHashSet
. Hibernate utilise sa propre mise en œuvre de laSet
interface appeléePersistentSet
qui ne provient pas de l'HashSet
et donc le casting jette unClassCastException
. Le choix de l'utiliser par le biais de laSet
de l'interface ou de créer un nouveauHashSet
à l'aide de son constructeur (le cas échéant, les modifications de cette série ne seront pas reflétées dans Hibernate automatiquement).OU
OriginalL'auteur Abhinav Sarkar
Abhinav Sarkar réponse est correct, bien sûr, mais il y a aussi une erreur dans votre modélisation.
La relation entre le DVD et le Contact est plusieurs-À-Plusieurs, pas Plusieurs-À-Un (sinon, chaque DVD devrait être unique pour un client unique)
Un utilisateur à un moment donné, oui. Mais si elle ne peut être loué par un utilisateur ne jamais, alors vous avez mal compris le concept de location quelque chose.
oui 🙂 ne vous inquiétez pas c'est une très cas très précis d'un dvd peut être loué par un utilisateur et lorsque l'utilisateur ramener le contact sur le terrain (sur le dvd de la ligne) est mis à null sna alors peut-être louer par un autre utilisateur 🙂
OriginalL'auteur Sean Patrick Floyd
J'ai rencontré ce problème récemment.
J'ai été en mesure d'éradiquer le casting problème.
List<Object> listObject = Arrays.asList(ListFromHibernate.toArray());
Alors vous pouvez obtenir les objets en jetant les objets dans la Liste, dire.
MyObject x = (MyObject) listObject.get(1);
PS: C'est flipper 2013.
OriginalL'auteur threepoint1416