2009-08-04 6 views
0
@Entity 
public class A { 
    @Column(name="Foos") 
    @Basic 
    private HashSet<Foo> fooList = new HashSet<Foo>(); 
} 

où la classe Foo n'a rien de spécial, implémente simplement Serializable. Essentiellement, je veux sérialiser l'ensemble de HashSet à la base de données. Ce mapping fonctionne bien pour persister, mais quand j'essaye de le charger, je reçois une exception ClassNotFoundException sur Foo.hibernate: Cette correspondance est-elle autorisée?

Exception entier:

... 

Caused by: org.hibernate.type.SerializationException: could not deserialize 
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:214) 
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:240) 
    at org.hibernate.type.SerializableType.fromBytes(SerializableType.java:82) 
    at org.hibernate.type.SerializableType.get(SerializableType.java:39) 
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163) 
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154) 
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81) 
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2101) 
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380) 
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308) 
    at org.hibernate.loader.Loader.getRow(Loader.java:1206) 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:701) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
    at org.hibernate.loader.Loader.doList(Loader.java:2213) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
    at org.hibernate.loader.Loader.list(Loader.java:2099) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:66) 
    ... 25 more 
Caused by: java.lang.ClassNotFoundException: Foo 
    at com.sun.appserv.server.util.ASURLClassLoader.loadClass(ASURLClassLoader.java:129) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:247) 
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604) 
    at org.hibernate.util.SerializationHelper$CustomObjectInputStream.resolveClass(SerializationHelper.java:268) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at java.util.HashSet.readObject(HashSet.java:291) 
    at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:210) 
    ... 47 more 
+0

C'est en fait la classe Detector qui ne peut pas être trouvée n'est-ce pas? Comment cela s'intègre-t-il dans le modèle de domaine? –

+0

Merci, corrigé la trace de la pile. – gjrwebber

Répondre

1

Pas la façon dont vous essayez de le faire est pas légal.

Essayez de remplacer par ceci:

@CollectionOfElements 
private HashSet<Foo> fooList = new HashSet<Foo>(); 

Si vous faites cela, hibernent créera table supplémentaire pour stocker les éléments de la liste. Il est similaire à avoir @OneToMany à l'entité supplémentaire Foo mais avec une syntaxe beaucoup plus courte

+0

+1. Cependant, "similaire à avoir @OneToMany à l'entité supplémentaire Foo mais avec une syntaxe beaucoup plus courte" est très faux. @CollectionOfElements mappe 'Foo's en tant que composant dont le cycle de vie est lié à l'entité propriétaire; @OneToMany mappe une relation entre des entités dont les cycles de vie sont généralement indépendants (bien que la dépendance puisse être émulée via le code approprié et les paramètres de cascade) – ChssPly76

+0

Non, même erreur. – gjrwebber

+0

ClassNotFound? C'est probablement lié au déploiement/à la construction - cela n'a pas grand chose à voir avec hibernate. Êtes-vous sûr que Foo est dans le classpath lorsque vous exécutez votre exemple? Après avoir corrigé cela, la solution ci-dessus devrait fonctionner. –

0

Il s'est avéré que c'était un problème avec le chargeur de classes Grizzly dans Glassfish. Cela n'avait rien à voir avec le mappage d'hibernation. Bien que l'hibernation puisse encore contribuer à la cause à un niveau inférieur.