2019独角兽企业重金招聘Python工程师标准>>>
软件环境: JDK1.6、Spring3.0.5、Hibernate3.2.2、Hessian3.1.5
参考Spring Documents:中文|英文
服务端:
###1. remoting-servlet.xml
###2. LazyHibernateSerializerFactory实现
参考: https://github.com/resthub/spring-amqp-hessian/issues/5
引用: http://code.google.com/p/rich-hibernate-lazy/wiki/HessianWithLazyHibernate
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;import org.hibernate.Hibernate;
import org.hibernate.collection.PersistentList;
import org.hibernate.collection.PersistentMap;
import org.hibernate.collection.PersistentSet;import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.CollectionSerializer;
import com.caucho.hessian.io.HessianProtocolException;
import com.caucho.hessian.io.JavaSerializer;
import com.caucho.hessian.io.MapSerializer;
import com.caucho.hessian.io.Serializer;
import com.caucho.hessian.io.SerializerFactory;/*** 处理:Hessian远程调用时,对象序列化hibernate实体bean中集合对象延迟加载问题 ,* 采取将集合对象替换为空集合。* **/
public class LazyHibernateSerializerFactory extends SerializerFactory {public static String versionString = org.hibernate.Version.getVersionString();@Overridepublic Serializer getSerializer(Class cls) throws HessianProtocolException {try {if(versionString.startsWith("3") &&Class.forName("org.hibernate.collection.PersistentCollection").isAssignableFrom(cls)){return new LazySerializerForHibernate3(cls); }else if(versionString.startsWith("4") && Class.forName("org.hibernate.collection.spi.PersistentCollection").isAssignableFrom(cls)){return new LazySerializerForHibernate4(cls); }} catch (ClassNotFoundException e) {e.printStackTrace();}return super.getSerializer(cls);}
}class LazySerializerForHibernate3 extends JavaSerializer {public LazySerializerForHibernate3(Class cls) {super(cls);}CollectionSerializer collectionSeiralizer = new CollectionSerializer();MapSerializer mapSerializer = new MapSerializer();/*** @Title: writeObject* @Description: TODO(override hessian write)* @param @param object* @param @param out* @param @throws IOException* @return void* @throws*/@SuppressWarnings("unchecked")@Overridepublic void writeObject(Object object, AbstractHessianOutput out)throws IOException {boolean ifHaveInit = Hibernate.isInitialized(object);Object obj = convertPersistent(object);if (ifHaveInit && object!=null) {out.writeObject(obj); out.flush();return;}if (PersistentMap.class.isAssignableFrom(object.getClass())) {mapSerializer.writeObject(new HashMap(), out);} else {collectionSeiralizer.writeObject(new ArrayList(), out);}}@SuppressWarnings("unchecked")public static List convertListFromPersistentList(PersistentList plist) {List list = new ArrayList();if (plist != null) {for (int i = 0; i
}
###3. web.xml 中添加
客户端:
###1. HessianClient.java
import com.caucho.hessian.client.HessianProxyFactory;
import service.UnifiedUserMng;public class HessianClient {public static void main(String[] args) throws Exception {// 远程调用地址String url = "http://localhost:8080/remoting/UnifiedUserService";// 默认写法HessianProxyFactory factory = new HessianProxyFactory(); // 实例化UnifiedUserService base = (UnifiedUserService) factory.create(UnifiedUserMng.class, url);// 调用接口,并打印结果System.out.println(base.getByUsername("admin").getEmail());}
}
总结
Hibernate抛出no session or session closed原因:Hessian调用服务器服务,序列化Hibernate持久化对象中集合对象(Set)时,session已经关闭。参考