2012-04-10 8 views
1

Ich schreibe den folgenden benutzerdefinierten serializable Usertype erhalten:Wie Objekttyp in Usertype nullSafeGet

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); 
    } 
} 

Ich könnte sogar die registrierte serialable Klasse damit außer Kraft setzen. Falls Sie interessiert sind, ist die Implementierung von SerA der Protostuff Serializer.

Wie auch immer, es scheint nicht, dass irgendeine der Methoden, die das Objekt in dieser Schnittstelle bereitstellen, vor nullSafeGet aufgerufen werden, so dass es unmöglich ist, die Klasse des Objekts zu bestimmen, mit dem wir arbeiten, was es unmöglich macht, die Klasse zu erhalten für den Serialisierungsaufruf.

Daher scheint es, dass die einzige Lösung darin besteht, einen ParameterizedType zu erstellen und die Klasse des Objekts als eine Eigenschaft zu übergeben. :(

Antwort

1

Leider glaube ich, dass die einzige Lösung ist eine ParameterizedType zu verwenden und dann eine Typdefinition erstellen jedes Mal, wenn Sie wollen, es verwenden, um mit einer anderen Klasse.

Wenn Sie ein Beispiel benötigen, finden Sie den Code in diese Frage: Hibernate Entities from Multiple Databases