我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个的所有属性和方法都会自动序列化。
然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,诚然,你可以让这个类来实现Externalizable接口,这个接口是Serilizable的子接口,但是你必须实现readExternal和writeExternal方法,你可以在这两个方法中实现具体属性的反序列化和序列化操作。然而这就意味着你必须在这两个方法中手工编写额外的代码来进行具体属性的序列化。java的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
@Transient的作用 :
用于注释pojo对象中的属性,被注释的属性将成为短暂的,不会持久化到数据库的“短暂”属性。
Hibernate annotation 的实体类中如果存在数据库中没有的字段,也就是我们常说的根据业务需求临时添加的一些字段供我们存放数据,那么就需要在新添加的这个字段中加上 @Transient
例子:
package com.capinfo.plan.entity;
import java.sql.Blob;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
/**
* @类功能说明:基本信息表
* @创建时间:2013-6-18 上午10:15:45
* @版本:V1.0
*/
@Entity
@Table(name = "baseinfo")
public class NationCheckunitBaseinfo implements java.io.Serializable {
// Fields
private static final long serialVersionUID = 4141383356877794599L;
private String uuid;
private String route;
private Blob pic;
private Date lastUpdateTime;
//加签之后的字段
private String signField;
//验签返回值
private String signFlag;
// Constructors
/** default constructor */
public NationCheckunitBaseinfo() {
}
/** minimal constructor */
public NationCheckunitBaseinfo(String uuid) {
this.uuid = uuid;
}
/** full constructor */
public NationCheckunitBaseinfo(String uuid, String route,
Blob pic, Date lastUpdateTime,String signField) {
this.uuid = uuid;
this.route = route;
this.pic = pic;
this.lastUpdateTime = lastUpdateTime;
this.signField = signField;
}
// Property accessors
@Id
@Column(name = "UUID", unique = true, nullable = false, length = 36)
public String getUuid() {
return this.uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
@Column(name = "ROUTE", length = 100)
public String getRoute() {
return this.route;
}
public void setRoute(String route) {
this.route = route;
}
@Column(name = "PIC")
public Blob getPic() {
return this.pic;
}
public void setPic(Blob pic) {
this.pic = pic;
}
@Temporal(TemporalType.DATE)
@Column(name = "LAST_UPDATE_TIME", length = 10)
public Date getLastUpdateTime() {
return this.lastUpdateTime;
}
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
@Column(name = "SIGN_FIELD", length = 250)
public String getSignField() {
return signField;
}
public void setSignField(String signField) {
this.signField = signField;
}
@Transient
public String getSignFlag() {
return signFlag;
}
public void setSignFlag(String signFlag) {
this.signFlag = signFlag;
}
}
数据库中将不会出现signFlag对应的字段
使用的时候,该字段可以直接存储到实体类中
NationCheckunitBaseinfo baseinfo = list.get(i);
//将验签返回结果放到实体类的flag字段中
String result = getSignResult(baseinfo);
baseinfo .setSignFlag(result);
也可以存放到map中
Map map = list.get(i);
String nSignFlag = getSignResult(uuid,1, cardType,cardNumber,name,credentialCode);
String sSignFlag = getSignResult(uuid,2, checkIspass,examCardNum,getCardStatus,ttCode);
//将验签返回结果放到实体类的flag字段中
list.get(i).put("nSignFlag", nSignFlag);
list.get(i).put("sSignFlag", sSignFlag);
页面上:遍历时,该字段与其他字段一样使用