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

ここで、クラスFooは特別なものではなく、単にSerializableを実装しています。hibernate:このマッピングは許可されていますか?

基本的に私は、データベース全体にHashSetをシリアル化したいと思っています。このマッピングは正常に動作しますが、ロードしようとするとFooでClassNotFoundExceptionが返されます。

全体の例外:あなたはそれをやろう

... 

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

実際に検出できないDetectorクラスです。それはどのようにドメインモデルに適合しますか? –

+0

ありがとう、スタックトレースを修正しました。 – gjrwebber

答えて

1

方法は有効ではありません。

これと交換してみてください:

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

あなたがこれを行う場合は、Hibernateは、リストの要素を格納するために追加のテーブルを作成します。追加のエンティティFooに対して@OneToManyを使用するのと似ていますが、構文がはるかに短くなります。

+0

+1。しかし、 "@OneToManyを追加のエンティティFooに持たせるのと似ていますが、構文がはるかに短い"というのは非常に間違っています。 @CollectionOfElementsは、ライフサイクルが所有エンティティにバインドされているコンポーネントとして 'Foo'sをマップします。 @OneToManyは、ライフサイクルが一般に独立しているエンティティ間の関係をマップします(ただし、依存関係は適切なコードとカスケード設定でエミュレートできます)。 – ChssPly76

+0

同じエラーです。 – gjrwebber

+0

ClassNotFound?おそらく展開/ビルド関連です。休止状態とはあまり関係がありません。あなたの例を実行しているときにFooがクラスパスに入っていることを確かめますか?それを修正したら、上記の解決策が機能するはずです。 –

0

グラスフィッシュのグライズクラスローダーの問題でした。これは、休止状態マッピングとは関係がありませんでした。休止状態が引き続き低いレベルの原因に寄与しているかもしれないが。

関連する問題