2013-03-15 3 views
0

은 내가 데이터베이스에 유지하려는 자바 클래스가 "결과 집합에서 열 값을 읽을 수 없습니다 ... 역 직렬화 수 없습니다":최대 절전 모드 :

여기
public class ClassA implements Serializable { 
    // 
    // other fields not shown 
    // 

    private ObjectType objectType; // an enum that indicates the actual class stored in the "object" field 
    private Object object; 
} 

은 Hibernate 매핑 파일입니다 :

최대 절전 모드를 사용하여 데이터베이스에 ClassA 인스턴스를 삽입하면 행이 삽입되고 "개체"필드가 longblob로 정의되어있는 것을 볼 수 있습니다. 그러나 MySQL Workbench를 사용하여 "객체"필드의 데이터를 보면 데이터 길이가 255 바이트임을 알 수 있습니다. "object"필드에 저장하려고하는 객체에는 결합 된 길이가 255자를 넘는 문자열이 포함되어 있습니다. longblob 열에 저장되기 전에 압축되고 있습니까? 내가 삽입 된 행에 대해 쿼리 최대 절전 모드를 사용하려고하면

오전 데 문제입니다. 반환 0 행을 최대 절전 모드 및 최대 절전 모드에서 나는 다음과 같은 오류를 참조 로그 : 객체가 LONGBLOB 열에 때 최대 절전 모드 저장을 압축하지 않을 경우

8167 [Thread-32] INFO org.hibernate.type.SerializableType - could not read column value from result set: OBJECT195_0_; could not deserialize 

을, 나는 그 "는을 수있는 원인을 추측 비 직렬화 "오류입니다. 나는 그것이 255 바이트보다 큽니다. 그러나 MySQL Workbench는 255 바이트 길이라고 말합니다. 그래서 어떤 이유로 객체가 잘려나 간 것입니다.

그러나 개체가 압축되는 경우 그냥 java.lang.Object 상위 유형 그리고 그것은 실제 객체 유형이 무엇인지 알 수 없어 어쩌면 Hibernate는 직렬화 수 없습니다. 이 경우, Hibernate를위한 커스텀 디시리얼라이저를 작성하는 방법이 있습니까? 실제 객체 유형은 "objectType"필드로 표시되므로 사용자 정의 디시리얼라이저는 "objectType"필드를 확인한 다음 "객체"필드를 비 직렬화하는 방법을 알 수 있습니다.

답변

0

기본적으로 절전 모드가 255 바이트로 LONGBLOB 컬럼의 최대 크기를 설정하는 것을 밝혀. 문제를 해결

<property name="object" column="OBJECT" type="serializable" length="2147483647"/> 

: 나는에 매핑 파일의 라인을 변경했습니다.