本文共 1729 字,大约阅读时间需要 5 分钟。
现在前后台交互的数据传输采用JSON格式,是一种很常用和普遍的形式。在JSON处理数据的过程中,经常会去掉handler,代码如下:
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes(new String[] { "hibernateLazyInitializer", "
handler" });
有段时间一直不角,在网上查找后有所了解,但一直是未见其真面目,有一次系统测试中,偶然看到了。。。。
其实根据数据返回的结果,还可以去掉tradeLocas,这样得到的数据全部都是
TradeLog对象了,即会返回一个JSON数组或JOSN对象,全是 TradeLog对象的属性及其值,而不会出现T radeLoca对象的属性。 上一点还好理解,剩下的需要理解——为什么会有handler这个东西呢?而且handler=JavassistLazyInitializer,这又是什么意思呢?handler的意思为处理者,管理者。个人认为handler的理解与代码有关,代码如下:
TradeLog oldLog = plusTradeLoca.getTradeLog(); oldLog 是通过其关联的对象来得到的,而不是一般的SQL语句查询的。 而 plusTradeLoca是通过SQL语句查询得到的,其只有 TradeLoca类相关的属性,而不存在handler这部分内容。 说明:
plusTradeLoca是 TradeLoca的一个对象,因为它们存在多对一关系,所以这句代码是没有问题的。 情况如下:有一个类TradeLog,与其有一个关联的类TradeLoca,项目采用了Hibernate框架,
TradeLoca与 TradeLog是多对一的关系,则多个 TradeLoca 对应一个 TradeLog,在调试时,放在一个 TradeLog对象上时,会显示其相关的属性等,截图如下: 截图中有handler和tradeLocas(这个是很正常的),其它的像empName,logNo,tradeTime都是 TradeLoca 的属性。介绍完毕后,开始说明handler的情况。 打开handler这一层,继续截图,如下图所示,下图中的formType和logNo是
TradeLog类的属性,剩下的就是handler了,它由componentIdType, constructed, entityName, getIdentifier, id, initialized, interfaces, overridesEquals, persistentClass, readOnly, readOnlyBeforeAttachedToSession, replacement, session, setIdentifierMethod, target, unwrap共16个内容组成。 上图中有一个entityName="com.posun.entity.warehouse.TradeLog",那么其value如下图所示,其实就是将
entityName的值分解展示显示的,value下每个字母和标点符号都是数组中的一个值,一共是35个,可以将 com.posun.entity.warehouse. TradeLog
分解开,确实是35个。 setIdentifierMethod内容如下所示:
target如下所示,其实就是这个TradeLog具体对象的属性及其值,由此可看出一个String类型的属性主要由count, hash, offset, value四个部分组成,value就是属性值的分解形式。同时,每个属性都有其id,比如dataCode属性的id为546。不同字段类型的属性的组成部分也不一样,比如BigDecimal和String类型的属性其组成部分就不一样。