Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save xcaspar/ab4e29985a53b19dd9d6 to your computer and use it in GitHub Desktop.
Save xcaspar/ab4e29985a53b19dd9d6 to your computer and use it in GitHub Desktop.

Hessian序列化Hibernate的延迟加载Set等集合问题

将原有的RMI服务调用的权限控制系统改写成Hession服务调用时,遇到了LazyInitializationException异常。此权限系统用的是ORM框架,分析产生此问题的原因是Hessian序列化对象时,此对象中包含Hibernate的集合映射,此时Hibernate的session已经关闭。<br / > 解决方法
针对Hibernate的PersistentCollection订制一个Serializer。
实现: 继承AbastractSerializer,重写WriteObject方法,再重写SerializerFactory,当对Hibernate 集合进行序列化的时候,使用定制化的序列化Class。

import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.AbstractSerializer;
import com.caucho.hessian.io.CollectionSerializer;
import com.caucho.hessian.io.MapSerializer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.hibernate.Hibernate;
import org.hibernate.collection.PersistentMap;
public class HibernateSerializer extends AbstractSerializer {
    CollectionSerializer collectionSeiralizer = new CollectionSerializer();
    MapSerializer mapSerializer = new MapSerializer();
    @Override
    public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
        boolean init = Hibernate.isInitialized(obj);
        if (init) {
            out.writeObject(obj);
            out.flush();
            return;
        }
        if (PersistentMap.class.isAssignableFrom(obj.getClass())) {
            //将没有初始化的Map序列化空的HashMap
            mapSerializer.writeObject(new HashMap(), out);
        } else {
            //将没有初始化的List,Set等序列化为空的ArrayList
            collectionSeiralizer.writeObject(new ArrayList(), out);
        }
    }
}


import com.caucho.hessian.io.HessianProtocolException;
import com.caucho.hessian.io.Serializer;
import com.caucho.hessian.io.SerializerFactory;
import org.hibernate.collection.PersistentCollection;
public class HibernateSerializerFactory  extends SerializerFactory {
@Override
public Serializer getSerializer(Class cl) throws HessianProtocolException {
    //Hibernate的集合API使用为HibernateSerializer序列化
    if (PersistentCollection.class.isAssignableFrom(cl)) {
        return new HibernateSerializer();
    }
    return super.getSerializer(cl);
}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment