2

次のカスタムのシリアライズ可能な UserType を書いています。

public class SerUserType extends MutableUserType {
    protected Class klass;
    protected SerA ser=F.g(SerA.class);
    public Class returnedClass() {
        return klass;
    }
    public int[] sqlTypes() {
        return new int[] {Types.BLOB};
    }
    public boolean equals(Object x, Object y) throws HibernateException {
        return ObjectUtils.equals(x, y);
    }
    public Object deepCopy(Object value) {
        klass=value.getClass();
        Copyable copyable=(Copyable)value;
        Object copy=copyable.copy();
        return copy;
    }
    public Object nullSafeGet(ResultSet resultSet,String[] names,SessionImplementor session,Object owner) 
        throws HibernateException,SQLException {
        byte[] b=(byte[])BlobType.INSTANCE.nullSafeGet(resultSet,names,session,owner);
        return ser.deser(b,klass);
    }
    public void nullSafeSet(PreparedStatement preparedStatement,Object value,int index,SessionImplementor session) 
        throws HibernateException,SQLException {
        BlobType.INSTANCE.nullSafeSet(preparedStatement,ser.ser(value),index,session);
    }
}

登録されたシリアル化可能なクラスをオーバーライドすることさえあります。ご参考までに、SerA の実装はプロトスタッフ シリアライザーです。

とにかく、このインターフェイスでオブジェクトを提供するメソッドのいずれかが nullSafeGet の前に呼び出されるようには見えないため、使用しているオブジェクトのクラスを特定することは不可能であり、シリアル化呼び出しのクラスを取得することは不可能です.

したがって、唯一の解決策は、ParameterizedType を作成し、オブジェクトのクラスをプロパティとして渡すことです。:(

4

1 に答える 1

1

残念ながら、唯一の解決策は ParameterizedType を使用し、それを別のクラスで使用するたびに型定義を作成することだと思います。

例が必要な場合は、この質問のコードを参照してください: Hibernate Entities from Multiple Databases

于 2012-04-10T04:55:40.787 に答える