具有审计跟踪的领域模型的类设计


Class design for domain model with audit trail

这是我的DB设计:

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属性吗?这样,我就可以使用组合,而不必在Person类和PersonHistory类之间复制代码。

我认为你应该避免重复你的DB列,我认为它应该是:

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...
}

因此,在对象模型中,您将能够从Person History中访问Person数据。