`
hapinwater
  • 浏览: 70499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hessian序列化Hibernate的延迟加载Set等集合的解决方案

阅读更多
假如有如下类,Customer和Order,在使用Hessian序列化Customer时,如果orders延迟加载,并且序列化时Hibernate的session已经关闭,则会抛出Hibernate的LazyInitializationException.

@Entity
public class Customer implements java.io.Serializable {

    @Id
    private long id;

    
    private String name;

    //一对多,延迟加载
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name="CUSTOMER_ID")
    private Set<Order> orders;
    ...........


@Entity
public class Order implements java.io.Serializable{

    @Id
    private long id;

    .......




该Set为Hibernate的PersistentSet,是Hibernate的PersistentCollection的子类。原因是Hessian序列化时,会调用PersistentSet的方法导致Hibernate从session里加载数据,如果session已经关闭,就会抛出异常,导致序列化出错。不仅Set会出现,PersistentCollection的其他子类也会出现该现象,如PersistentList,PersistentBag,PersistentMap等。使用JDK的序列化不会出现该现象。

解决方案如下,可以为Hibernate的PersistentColletion定制一个Serializer,代码如下:
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);
        }
    }

    

}


同时还需要定制一个序列化工厂SerializerFactory,代码如下:
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);
    }

}


可以调用HessianServlet.getSerializerFactory().addFactory()添加HibernateSerializerFactory  来使用该HibernateSerializer序列化Hibernate的PersistentCollection.
或者写一个serializers文件放到classpath的META-INF/hessian/目录下,该文件的内容为
org.hibernate.collection.PersistentCollection=HibernateSerializer
分享到:
评论
3 楼 finny2009 2015-01-14  
hessian和spring集合了 没有用到hessianServlet怎么使用addFactory()那
2 楼 hapinwater 2012-01-20  
Hessian的通常需要继承HessianServlet,然后在Servlet的init方法里调用HessianServlet.getSerializerFactory().addFactory(),把这个HibernateSerializerFactory加进去就可以。
1 楼 zhoujianghua 2011-10-09  
“可以调用HessianServlet.getSerializerFactory().addFactory()添加 HibernateSerializerFactory  来使用该HibernateSerializer序列化Hibernate的PersistentCollection.
或者写一个serializers文件放到classpath的META-INF/hessian/目录下,该文件的内容为”

是怎么做啊?看不大懂。。。。

相关推荐

    hessian学习基础篇——序列化和反序列化

    这对于优化自定义序列化逻辑或者解决Hessian使用中遇到的问题非常有帮助。 总结起来,Hessian是一种高效、轻量级的二进制序列化协议,特别适合于跨语言的网络通信。理解并掌握Hessian的基本概念和使用方法,能够...

    hessian序列化规范

    总结,Hessian序列化规范是分布式系统中的重要工具,理解其原理和使用方法,能够帮助我们构建高效、可靠的跨网络通信方案。然而,任何工具都有其适用场景,选择最合适的序列化协议应根据项目需求和性能要求来决定。

    Hessian 的字段序列化小记

    在IT行业中,序列化是一个非常重要的概念,尤其是在分布式系统、网络通信和持久化存储等领域。Hessian是一种二进制的序列化协议,由Caucho公司开发,它旨在提供高效、轻量级的数据交换方式。本文将围绕"Hessian的...

    S25-hessian反序列化1

    【S25-Hessian反序列化1】是一个关于Java中Hessian序列化库的讨论,主要涉及Hessian与原生Java序列化的差异以及在Spring框架中的应用。Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java...

    浅谈Java序列化和hessian序列化的差异

    Java序列化和Hessian序列化的差异 Java序列化和Hessian序列化是两种常用的序列化机制,它们都可以将对象转换为字节流,以便在网络上传输。但是,两者之间有着很大的差异,今天我们就来比较一下它们的实现机制和特点...

    Hessian 2.0序列化协议规范.docx

    《Hessian 2.0序列化协议规范》 在分布式计算和网络通信中,数据的序列化和反序列化是至关重要的环节。Hessian 2.0是一种高效的二进制序列化协议,它旨在减少网络传输的数据量,提高数据交换的效率。本文将详细介绍...

    Hessian RPC-RMI技术 整合Structs Spring Hibernate Ibatis

    在Hessian-RMI架构中,Hibernate可以用来处理数据的持久化。通过Hessian调用的远程服务,可以封装Hibernate的操作,使得客户端可以透明地操作数据库。 5. **Ibatis**: Ibatis是另一种轻量级的SQL映射框架,它可以...

    Nacos JRaft Hessian 反序列化 RCE 分析.pdf

    ### Nacos JRaft Hessian 反序列化 RCE 分析 #### 一、背景介绍 Nacos 是阿里巴巴开源的一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台。JRafT 是 SOFAStack 微服务平台中的一个分布式一致性组件...

    Springmvc+Hibernate+Hessian架包整合

    Hessian提供了透明的序列化和反序列化机制,使得Java对象可以直接跨网络进行传输。通过Hessian,开发者可以轻松地创建分布式服务,实现服务端与客户端之间的高效通信。 Spring MVC、Hibernate和Hessian的整合通常...

    removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)

    removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)

    Hessian应用

    这样,客户端通过网络发送一个Hessian序列化的请求,服务端接收后反序列化为本地对象,然后执行相应的操作,再序列化结果返回给客户端。 在实际应用中,Hessian主要应用于以下场景: 1. **分布式服务调用**:通过...

    Hessian

    2. **简单类型支持**:Hessian支持基本的Java数据类型,如整型、浮点型、字符串、日期等,并且可以序列化和反序列化复杂对象。 3. **流式传输**:Hessian协议允许数据分块传输,这意味着服务端可以立即响应部分结果...

    hessian java +c# 数据测试

    Hessian可以序列化和反序列化List和Map类型的集合,无论是基本类型还是自定义对象的集合。在Java端,`List`和`Map`会被转换成Hessian的特定格式,而在C#端,HessianNet会解析这些格式并创建相应的`ArrayList`或`...

    业务系统增加hessian接口解决方案

    在Spring+iabtis框架中,增加hessian接口,要实现以下几点: 1.绕过系统本身的认证,拦截器直接将该实现方法的servlet直接调用,需要重写拦截器。 2.由于绕过了spring和Struts,请求没有经过封装的事物管理器实例化,...

    Hessian学习简单demo

    总的来说,Hessian提供了高效、轻量级的跨语言通信解决方案,尤其适合对性能有较高要求的场景。通过学习和实践这个Hessian demo,你将能够更好地应对涉及远程调用和数据交换的问题。无论是Java开发者还是C++开发者,...

    Hessian 学习 例子 实例

    在IT行业中,Hessian是一种二进制序列化协议,它被广泛用于远程方法调用(RMI)和Web服务中,以提高数据传输效率。Hessian由Caucho Technology开发,其目标是提供轻量级、高效的通信方式,特别是在网络带宽有限的...

    hessian实现远程调用

    为了能够通过Hessian进行序列化和反序列化,实体类需要遵循特定的规则,例如字段类型要简单,避免复杂的嵌套结构。 3. **服务发布**: - 在服务器端,需要将实现类绑定到一个特定的URL,以便客户端可以通过该URL...

    hessian-4.0.51-src

    例如,`Hessian2Input`和`Hessian2Output`类分别用于反序列化和序列化对象。它们通过读写字节流来处理各种数据类型,包括基本类型、对象引用、集合和自定义类等。 2. **HTTP通信**:在"**com.caucho.hessian.client...

    hessian4.0.37

    Hessian由Caucho Technology开发,旨在提供轻量级、高性能的远程调用解决方案。在这个案例中,我们关注的是Hessian的版本4.0.37,即"hessian4.0.37.jar"。 Hessian4.0.37是Hessian协议的一个稳定版本,提供了对Java...

Global site tag (gtag.js) - Google Analytics