背景分析:
在企业内部信息系统中,大部分的业务数据可以简单的分成两类:
一、基础数据,为业务处理提供必需参数,在MIS系统中的客户信息、网点信息等等;
二、业务单据,为实现企业信息流、数据流、资金流的流转与控制提供业务数据支持,在快递企业中的运单就是一个典型业务单据。
简单的说,基础数据与具体业务关,业务单据就是只管具体业务。
基础数据的特点,1、涉及业务单据的引用问题,一旦引用就是不能删除;2、为了方便数据归类,使用编码进行分类数,如在财务系统中的科目;3、为了增强基础数据的可读性,我们需要增加一个名称属性,如果名称太长了,我们可以考虑增加一个检查或者备注;
业务数据呢,现实业务中所有单据都通过编码进行区分,比如发票,业务发生后要记录业务日期及记账日期,当业务记录错误时,我们要保证系统业务的原始记录,不能对系统原始数据直接更改(审计叫做业务数据的静止性),需要进行红冲,然后然后写入新的业务数据,新的业务数据业务编号、业务日期无需改变,记账则要记录到当前时间,如果发生多次红冲,如何处理呢,我们可以考虑增加一个有效版本控制。
再看看,是不是还少了主键?还有一种场景是不是没有考虑到,同一个单据或者基础数据被两个人同时编辑是不是会事务并发的问题?一个单据是否对应多个明细,如果进行处理?试着对问题的回答,对模型进一步总结形成以下结果。
如何通过基类简化开发工作,请见构建基于Hibernate的基类实体(2)
(第一次写博,欢迎大家指点,如有错误谢绝辱骂)。
package com.kds.kuaijian.framework.entity;
import java.io.Serializable;
import javax.persistence.*;
/**
* @generated
* 实体基类,用于将来扩展
*/
@MappedSuperclass
public abstract class CoreBase implements Serializable {
/**
*
*/
private static final long serialVersionUID = 3086983746058217854L;
/**
* @generated
* 主键,禁止为空,禁止更改
*/
@Column(length = 44,nullable = false,updatable = false)
@Id
private String id;
/**
* @generated
*/
public String getId() {
return this.id;
}
/**
* @generated
*/
public void setId(String value) {
this.id = value;
}
/**
* 别名
* @return
*/
public abstract String getAlias();
}
package com.kds.kuaijian.framework.entity;
import java.util.Date;
import javax.persistence.*;
/**
* @generated
* 业务对象基类,增加创建日期、更新时间、版本号,用于处理事务并发
*/
@MappedSuperclass
public abstract class ObjectBase extends CoreBase {
/**
*
*/
private static final long serialVersionUID = -3493844437392704456L;
/**
* @generated创建时间
*/
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入
private Date createTime;
/**
* @generated更新时间
*/
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdateTime;
/**
* 版本号
*/
@Column(nullable = false)
private int version;
/**
* @return the version
*/
public int getVersion() {
return version;
}
/**
* @param version the version to set
*/
public void setVersion(int version) {
this.version = version;
}
/**
* @return the createTime
*/
public Date getCreateTime() {
return createTime;
}
/**
* @param createTime the createTime to set
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* @return the lastUpdateTime
*/
public Date getLastUpdateTime() {
return lastUpdateTime;
}
/**
* @param lastUpdateTime the lastUpdateTime to set
*/
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
}
package com.kds.kuaijian.framework.entity;
import java.util.Date;
import javax.persistence.*;
/**
* 业务单据基类
*/
@MappedSuperclass
public abstract class BillBase extends ObjectBase {
private static final long serialVersionUID = -8711722606843400608L;
/**
* @generated编码
*/
@Column(length = 100, nullable = false, updatable = false)
private String number;
/**
* @generated描述
*/
@Column(length = 200)
private java.lang.String description;
/**
* 业务日期
*/
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入
private Date bizDate;
/**
* 记账日期
*/
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入
private Date acctDate;
/**
* 是否为有效版本
*/
@Column(nullable = false)
private boolean effectionVerion;
/**
* 是否为红单
*/
@Column(nullable = false)
private boolean redBill;
/**
* @generated
*/
public java.lang.String getDescription() {
return this.description;
}
/**
* @generated
*/
public void setDescription(java.lang.String value) {
this.description = value;
}
/**
* @return the number
*/
public String getNumber() {
return number;
}
/**
* @param number the number to set
*/
public void setNumber(String number) {
this.number = number;
}
/**
* @return the bizDate
*/
public Date getBizDate() {
return bizDate;
}
/**
* @param bizDate the bizDate to set
*/
public void setBizDate(Date bizDate) {
this.bizDate = bizDate;
}
/**
* @return the acctDate
*/
public Date getAcctDate() {
return acctDate;
}
/**
* @param acctDate the acctDate to set
*/
public void setAcctDate(Date acctDate) {
this.acctDate = acctDate;
}
/**
* @return the effectionVerion
*/
public boolean isEffectionVerion() {
return effectionVerion;
}
/**
* @param effectionVerion the effectionVerion to set
*/
public void setEffectionVerion(boolean effectionVerion) {
this.effectionVerion = effectionVerion;
}
/**
* @return the redBill
*/
public boolean isRedBill() {
return redBill;
}
/**
* @param redBill the redBill to set
*/
public void setRedBill(boolean redBill) {
this.redBill = redBill;
}
}
package com.kds.kuaijian.framework.entity;
import javax.persistence.*;
/**
* 基础数据基类
*/
@MappedSuperclass
public abstract class BaseData extends ObjectBase {
private static final long serialVersionUID = -8711722606843400608L;
/**
* @generated编码
*/
@Column(length = 100, nullable = false ,updatable = false)
private String number;
/**
* @generated名称
*/
@Column(length = 200, nullable = false,updatable = false)
private java.lang.String name;
/**
* @generated简称
*/
@Column(length = 200)
private java.lang.String simpleName;
/**
* @generated描述
*/
@Column(length = 200)
private java.lang.String description;
/**
* 是否删除
*/
@Column(nullable = false)
private boolean isDelete;
/**
* @generated
*/
public java.lang.String getName() {
return this.name;
}
/**
* @generated
*/
public void setName(java.lang.String value) {
this.name = value;
}
/**
* @generated
*/
public java.lang.String getSimpleName() {
return this.simpleName;
}
/**
* @generated
*/
public void setSimpleName(java.lang.String value) {
this.simpleName = value;
}
/**
* @generated
*/
public java.lang.String getDescription() {
return this.description;
}
/**
* @generated
*/
public void setDescription(java.lang.String value) {
this.description = value;
}
/**
* @return the number
*/
public String getNumber() {
return number;
}
/**
* @param number the number to set
*/
public void setNumber(String number) {
this.number = number;
}
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean isDelete) {
this.isDelete = isDelete;
}
}
posted on 2011-09-20 23:50
民工二代 阅读(462)
评论(0) 编辑 收藏