@Transient
private String strOrderAmt;//可以通过hessian传输,且不参与hibernate操作
transient private String strOrderAmt2;//不可以通过hessian传输,也不参与hibernate操作
另外,hessian传输对象时有一个奇怪问题,
当一个Vo对象在hessian方法调用时,被放到不同的方法形参里,则hessian会报错,这时只能用transient关键字对某个实参里的Vo对象取消序列化才可以
如下:
public class BasBatchPayOrderTask implements Serializable {
@Transient
private List<BasBatchPayOrderDtl> orderList;
}
//hessian不能传输,会报错,
service.saveBatchFlow(task, task.getOrderList());
//或者第二个形参置为null,hessian能传输
service.saveBatchFlow(task, null);
或者
//或者把@Transient改成transient
public class BasBatchPayOrderTask implements Serializable {
transient private List<BasBatchPayOrderDtl> orderList;
}
//hessian能传输
service.saveBatchFlow(task, task.getOrderList());
另外,在做子订单大于49999.99拆单时,发现拆单金额(BigDecimal类型)如果被多个子订单引用,则hessian不能传输,会抛异常
private BigDecimal singleMaxAmount = new BigDecimal("49999.99");
// 未切割金额大于singleMaxAmount
if (unsplitAmt.compareTo(singleMaxAmount)>0) {
extOrderVo.setOrderAmt(singleMaxAmount);//不能传输,因为singleMaxAmount被多次引用
extOrderVo.setOrderAmt(new BigDecimal(singleMaxAmount.toString()));//正确写法,新new一个对象
} else {// 未切割金额小于等于singleMaxAmount
extOrderVo.setOrderAmt(unsplitAmt);
}
最后,hessian传输总结如下:
hessian传输数据(范围包括方法上的全部形参)里的任何class对象(包括BigDecimal)只能存在一个引用,如果有两个以上引用则不能传输,会报异常