簡體   English   中英

具有審計線索的領域模型的類設計

[英]Class design for domain model with audit trail

這是我的數據庫設計:

Person
------------------------------------------------
ID                UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL


Person_History
------------------------------------------------
ID                UINT NOT NULL,
PersonID          UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL
AuditID           UINT NOT NULL


Audit
------------------------------------------------
ID                UINT NOT NULL,
UserID            UINT NOT NULL,               -- Who
AffectedOn        DATE NOT NULL,               -- When
Comment           VARCHAR(500) NOT NULL        -- Why

我希望能夠為人員歷史記錄類重用大多數人員代碼,因為屬性是重復的。 按照現在的方式,我是否應該考慮並封裝人員屬性? 這樣,我可以使用組合,而不必在Person類和PersonH​​istory類之間重復代碼?

我認為您應該避免重復數據庫列:

Person
------------------------------------------------
ID                UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL


Person_History
------------------------------------------------
ID                UINT NOT NULL,
PersonID          UINT NOT NULL,
AuditID           UINT NOT NULL


Audit
------------------------------------------------
ID                UINT NOT NULL,
UserID            UINT NOT NULL,               -- Who
AffectedOn        DATE NOT NULL,               -- When
Comment           VARCHAR(500) NOT NULL        -- Why

如果您使用的是JPA,則可以按以下方式映射您的類:

@Entity
@Table(name = "PERSON")
public class Person {

@Id
@Column(name = "ID", unique = true, nullable = false)
private Integer id;

@Column(name = "DOB")
@Temporal(TemporalType.DATE)
private Date birthDate;

@Column(name = "EMAIL")
private String email;

@OneToMany(mappedBy="person", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
private List<PersonHistory> personHistories;

// getters and setters...

}


@Entity
@Table(name = "PERSON_HISTORY")
public class PersonHistory {

@Id
@Column(name = "ID", unique = true, nullable = false)
private Integer id;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_PERSON", nullable=false)
private Person person;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_AUDIT", nullable=false)
private Audit audit;

// getters and setters...

}


@Entity
@Table(name = "AUDIT")
public class Audit {

@Id
@Column(name = "ID", unique = true, nullable = false)
private Integer id;

@Column(name = "AFFECTED_ON")
@Temporal(TemporalType.DATE)
private Date affectedOn;

@Column(name = "COMMENT")
private String comment;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_USER", nullable=false)
private User user;

// getters and setters...

}

因此,在對象模型中,您將能夠從“人員歷史記錄”中訪問“人員”數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM