`

java的transient和@Transient注解的区别及hessian传输怪现象

阅读更多
@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)只能存在一个引用,如果有两个以上引用则不能传输,会报异常

 

分享到:
评论

相关推荐

    JPA-2 基本注解

    在JPA中,注解扮演着至关重要的角色,用于将Java类和字段映射到数据库表和列。以下是JPA的一些基本注解的详细解释: 1. **@Entity**: 这个注解标记一个Java类作为实体类,意味着这个类的实例将被持久化到数据库中。...

    Java中的transient关键字.doc

    因此,transient 关键字是 Java 编程中一个非常重要的概念,每个 Java 开发者都应该了解和掌握它。 需要注意的是,transient 关键字只是告诉 JVM 不要序列化被标记的属性,但它并不能保证这些属性的安全性。如果...

    JPA注解@Access实例

    在测试项目`test-jpa`中,你可以找到关于`@Access`注解的实例代码,这将帮助你更好地理解和应用这个注解。通过分析和运行这些示例,你将能更直观地看到不同访问策略在不同场景下的效果。 总结,`@Access`注解是JPA...

    Hibernate注解详解(超全面不解释).pdf

    对于实体Bean的属性,非`static`和非`transient`的属性默认会被持久化,除非使用`@Transient`注解标记为非持久化属性。`@Basic`注解用于标记基本类型的属性,`fetch = FetchType.LAZY`表示延迟加载: ```java ...

    java关键字transient

    在Java编程语言中,`transient`是一个非常重要的关键字,它与对象持久化和序列化密切相关。当一个字段被声明为`transient`时,它表明该字段的值不会随着对象的序列化而保存。这通常用于那些不希望或者不需要在序列化...

    Java_transient关键字

    ### Java中的transient关键字详解 在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列...同时,理解`transient`与`volatile`之间的区别也是处理复杂Java应用中的多线程和序列化问题的关键。

    基于java访问mysql数据库一

    兼容MP 排除字段逻辑(static、transient修饰字段和@TableField注解exist=false) 兼容MP @TableField、@TableName,@TableId注解 兼容MP @TableId注解设置自增 兼容hibernate @Table、@Column、@Id、@Transient注解 ...

    Java transient关键字使用小记

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...

    hibernate注解学习笔记

    Hibernate是Java领域内最流行的ORM(Object Relational Mapping)框架之一,它通过提供强大的映射工具和服务,将面向对象的数据模型(即Java类)与传统的关系型数据库模型之间建立起一种关联机制。在Hibernate中,...

    hibernate注解详解

    ### Hibernate注解详解 #### 实体Bean的概念与创建 Hibernate框架是Java开发中非常重要的对象关系映射(ORM)工具之一,它简化了数据库操作,让开发者能够更加专注于业务逻辑而不是繁琐的SQL语句编写。在Hibernate...

    Java之transient关键字.Java

    在给定的文件列表中,除了与`transient`关键字相关的`Java之transient关键字.md`文件,其他如`javaweb\Tomcat.md`、`javaweb\Cookie、Session、localStorage、sessionStorage区别和用法.md`等文件可能涉及Web开发中...

    Hibernate4实战之Hibernate4注解零配置

    在Java的ORM框架Hibernate4中,注解零配置是一种简化持久化对象(POJOs)映射的方法,它允许开发者避免使用XML配置文件,而是直接在Java类和属性上使用注解来描述数据库表和字段的映射关系。以下是关于Hibernate4...

    java程序使用JPA注解详解.zip

    Java持久化API(Java Persistence API,简称JPA)是Java平台上的一个标准,用于管理和持久化应用程序中的对象。它提供了一种将业务对象与数据库表之间的映射关系进行声明的方式,使得开发者无需编写大量的SQL语句,...

    transient Java语言的关键字

    transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,

    Java关键字Transient与串行化

    在Java编程语言中,`transient`关键字与对象的序列化(serialization)机制密切相关,它在处理对象状态的持久化时扮演着关键角色。本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ...

    Hibernate注解详解(超全面不解释)

    在这里,`@Entity`注解用于将一个Java类声明为实体Bean,而`@Id`注解则用来标记实体Bean的主键属性。 #### 表的定义与约束 通过使用`@Table`注解,可以为实体Bean指定对应的数据库表名、目录以及schema。例如: `...

    Java关键字transient

    在Java编程语言中,`transient`是一个非常重要的关键字,它与对象的序列化息息相关。序列化是将一个对象的状态转换为字节流的过程,这样就可以存储或在网络中传输。当我们标记一个字段为`transient`时,意味着该字段...

    Hibernate注解详解

    Hibernate注解是其提供的一种元数据方式,它允许开发者通过在类和属性上添加注解,来声明和配置实体 Bean 与数据库之间的映射关系,从而实现对象的持久化。本篇将详细介绍Hibernate注解的一些核心概念。 1. **实体 ...

    annotation(java注解类型,区别)

    了解这些不同的注解类型及其区别,有助于编写更清晰、更可维护的代码,并利用Java平台提供的工具和框架功能。在实际开发中,应根据需求选择适当的注解,以提高代码质量和可读性。同时,注解的使用也应遵循一定的最佳...

    JAVA ---JPA注解

    ### JAVA -- JPA注解详解 #### 1. @Entity 注解 - **定义**:`@Entity` 是 Java Persistence API (JPA) 中用于标识一个类作为持久化实体类的关键注解。它告诉 JPA 提供商(如 Hibernate)这个类将会映射到数据库表...

Global site tag (gtag.js) - Google Analytics