热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring+Hibernate整合Hessian

2019独角兽企业重金招聘Python工程师标准软件环境:JDK1.6、Spring3.0.5、Hibernate3.2.2、Hessian3.1.5参考Spr

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

软件环境: 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 }class LazySerializerForHibernate4 extends JavaSerializer {public LazySerializerForHibernate4(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);if (ifHaveInit) {out.writeObject(object);out.flush();return;}try {if (Class.forName("org.hibernate.collection.internal.PersistentMap").isAssignableFrom(object.getClass())) {mapSerializer.writeObject(new HashMap(), out);} else {collectionSeiralizer.writeObject(new ArrayList(), out);}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

###3. web.xml 中添加

osivFilterorg.springframework.orm.hibernate3.support.OpenSessionInViewFilter

osivFilter/remoting/*

hessianorg.springframework.web.servlet.DispatcherServletcontextConfigLocation/WEB-INF/config/application-context.xml,/WEB-INF/config/remoting-servlet.xml

hessian/remoting/*

客户端:

###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已经关闭。参考


转载于:https://my.oschina.net/dexterman/blog/148309


推荐阅读
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
XsiaoHan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有