在企業內部信息系統中,大部分的業務數據可以簡單的分成兩類:
一、基礎數據,為業務處理提供必需參數,在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();
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}