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

클래스 Foo는 특별한 것이 아니며 Serializable 만 구현합니다.최대 절전 모드 :이 매핑이 허용됩니까?

기본적으로 전체 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>(); 

가,리스트 요소를 추가 저장할 테이블을 생성합니다 최대 절전 모드. 추가 엔티티 Foo에 @OneToMany를 사용하는 것과 비슷하지만 구문이 훨씬 짧습니다.

+0

+1. 그러나 "@OneToMany를 추가 엔티티 Foo에 사용하는 것과 비슷하지만 구문이 훨씬 짧습니다"는 것은 매우 잘못된 것입니다. @CollectionOfElements는'Foo'를 수명주기가 소유 한 엔티티에 바인딩 된 구성 요소로 매핑합니다. @OneToMany는 라이프 사이클이 일반적으로 독립적 인 엔티티 간의 관계를 매핑합니다 (종속성은 적절한 코드 및 캐스케이드 설정을 통해 에뮬레이트 될 수 있음). – ChssPly76

+0

아니요, 같은 오류입니다. – gjrwebber

+0

ClassNotFound? 아마도 배포/빌드 관련 일 것입니다. 최대 절전 모드와 관련이 없습니다. Foo가 예제를 실행할 때 classpath에 있는지 확실합니까? 문제를 해결 한 후에 위의 해결 방법이 효과가 있습니다. –

0

글래스 피쉬의 그리즐리 클래스 로더와 관련된 문제였습니다. 그것은 최대 절전 모드 매핑과 아무 관련이 없습니다. 최대 절전 모드는 여전히 낮은 수준의 원인에 기여할 수 있습니다.