[英]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類和PersonHistory類之間重復代碼?
我認為您應該避免重復數據庫列:
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.