背景分析:
在企業(yè)內(nèi)部信息系統(tǒng)中,大部分的業(yè)務(wù)數(shù)據(jù)可以簡單的分成兩類:
一、基礎(chǔ)數(shù)據(jù),為業(yè)務(wù)處理提供必需參數(shù),在MIS系統(tǒng)中的客戶信息、網(wǎng)點信息等等;
二、業(yè)務(wù)單據(jù),為實現(xiàn)企業(yè)信息流、數(shù)據(jù)流、資金流的流轉(zhuǎn)與控制提供業(yè)務(wù)數(shù)據(jù)支持,在快遞企業(yè)中的運(yùn)單就是一個典型業(yè)務(wù)單據(jù)。
簡單的說,基礎(chǔ)數(shù)據(jù)與具體業(yè)務(wù)關(guān),業(yè)務(wù)單據(jù)就是只管具體業(yè)務(wù)。
基礎(chǔ)數(shù)據(jù)的特點,1、涉及業(yè)務(wù)單據(jù)的引用問題,一旦引用就是不能刪除;2、為了方便數(shù)據(jù)歸類,使用編碼進(jìn)行分類數(shù),如在財務(wù)系統(tǒng)中的科目;3、為了增強(qiáng)基礎(chǔ)數(shù)據(jù)的可讀性,我們需要增加一個名稱屬性,如果名稱太長了,我們可以考慮增加一個檢查或者備注;
業(yè)務(wù)數(shù)據(jù)呢,現(xiàn)實業(yè)務(wù)中所有單據(jù)都通過編碼進(jìn)行區(qū)分,比如發(fā)票,業(yè)務(wù)發(fā)生后要記錄業(yè)務(wù)日期及記賬日期,當(dāng)業(yè)務(wù)記錄錯誤時,我們要保證系統(tǒng)業(yè)務(wù)的原始記錄,不能對系統(tǒng)原始數(shù)據(jù)直接更改(審計叫做業(yè)務(wù)數(shù)據(jù)的靜止性),需要進(jìn)行紅沖,然后然后寫入新的業(yè)務(wù)數(shù)據(jù),新的業(yè)務(wù)數(shù)據(jù)業(yè)務(wù)編號、業(yè)務(wù)日期無需改變,記賬則要記錄到當(dāng)前時間,如果發(fā)生多次紅沖,如何處理呢,我們可以考慮增加一個有效版本控制。
再看看,是不是還少了主鍵?還有一種場景是不是沒有考慮到,同一個單據(jù)或者基礎(chǔ)數(shù)據(jù)被兩個人同時編輯是不是會事務(wù)并發(fā)的問題?一個單據(jù)是否對應(yīng)多個明細(xì),如果進(jìn)行處理?試著對問題的回答,對模型進(jìn)一步總結(jié)形成以下結(jié)果。
如何通過基類簡化開發(fā)工作,請見構(gòu)建基于Hibernate的基類實體(2)
(第一次寫博,歡迎大家指點,如有錯誤謝絕辱罵)。
package com.kds.kuaijian.framework.entity;
import java.io.Serializable;
import javax.persistence.*;
/**
* @generated
* 實體基類,用于將來擴(kuò)展
*/
@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
* 業(yè)務(wù)對象基類,增加創(chuàng)建日期、更新時間、版本號,用于處理事務(wù)并發(fā)
*/
@MappedSuperclass
public abstract class ObjectBase extends CoreBase {
/**
*
*/
private static final long serialVersionUID = -3493844437392704456L;
/**
* @generated創(chuàng)建時間
*/
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate會自動把當(dāng)前時間寫入
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.*;
/**
* 業(yè)務(wù)單據(jù)基類
*/
@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;
/**
* 業(yè)務(wù)日期
*/
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate會自動把當(dāng)前時間寫入
private Date bizDate;
/**
* 記賬日期
*/
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)//不用set,hibernate會自動把當(dāng)前時間寫入
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.*;
/**
* 基礎(chǔ)數(shù)據(jù)基類
*/
@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
民工二代 閱讀(464)
評論(0) 編輯 收藏