Hibernate父子关联序列化处理

Hibernate父子关联序列化处理

问题描述

Hibernate持久化时,包含父子级关联,如果父子级属性对象存在,即使该父子级对象为空,即“{}”,序列化时会将其自我关联

解决思路

Jackson序列化处理

  1. 在外部json数据序列化当前对象时,父子级字段上添加制定序列化方法,即
    @JsonDeserialize(using = ObjectDeserializer.class)
    private DataCatagoryDto parent;
  2. 指定序列化方法

    
    public class ObjectDeserializer <T extends BaseEntityDto> extends JsonDeserializer<T> implements ContextualDeserializer {
    
    private JavaType type;
    
    public ObjectDeserializer() {
    }
    
    public ObjectDeserializer(JavaType type) {
        this.type = type;
    }
    
    /**
     *  序列化方式
     */
    @Override
    public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        ObjectCodec codec = p.getCodec();
        JsonNode jsonNode = codec.readTree(p);
        if (jsonNode.isObject() && !StringUtils.isEmpty(jsonNode.get("uuid").toString()) && !"null".equals(jsonNode.get("uuid").toString())){
            return (T) JsonUtil.fromJSON(jsonNode.toString(),type.getRawClass());
        }
        return null;
    }
    
    /**
    * 序列化统一处理时需要实现ContextualDeserializer,并实现下列方法
    */
    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
        JavaType type = ctxt.getContextualType() != null
                ? ctxt.getContextualType()
                : property.getMember().getType();
        return new ObjectDeserializer<>(type);
    }
    }