简体   繁体   English

具有审计线索的领域模型的类设计

[英]Class design for domain model with audit trail

This is my DB design: 这是我的数据库设计:

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

I would like to be able to reuse most of the person code for the person history class, since the properties are duplicated. 我希望能够为人员历史记录类重用大多数人员代码,因为属性是重复的。 With the way it is now, should I be factoring out and encapsulating the person properties? 按照现在的方式,我是否应该考虑并封装人员属性? This way, I can use composition, instead of having to duplicate code between a Person class and a PersonHistory class? 这样,我可以使用组合,而不必在Person类和PersonH​​istory类之间重复代码?

I believe you should avoid duplicating your DB columns in my opinion it should be: 我认为您应该避免重复数据库列:

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

In case you're using JPA your classes could be mapped like this: 如果您使用的是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...

}

So in your object model you will be able to access Person data from Person History. 因此,在对象模型中,您将能够从“人员历史记录”中访问“人员”数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM