我质疑我设计JavaBeans的方式。例如,假设我有以下内容:
Employee - basic employee information:
private String employee_id;
private String first_name;
private String last_name;
private String phone;
private String deptNo;
etc..
WorkflowPlayer - details about an employee in a system workflow:
private String workflow_instance_id;
private String employee_id;
private String role_class_id;
private String role_required;
private Employee employee;
private RoleClass roleClass;
RoleClass - details of a type of role (Approver, SecurityReviewer, Originator, Instructor, Manager, etc..)
private String role_class_id;
private String name;
private String label;
private String description;
这三个模型也直接对应数据库表(员工是我的只读视图,如果这很重要的话)
然后在我看来,我会做类似的事情
workflow_player.employee.first_name
workflow_player.roleClass.label
让Employee成为实例变量是否可以接受?或者我应该使用Employee扩展WorkflowPlayer然后执行
workflow_player.first_name
这对员工有意义,但对于roleClass却没有意义
workflow_player.description
//不!
我只想使用一致的[正确]模式
答案 0 :(得分:2)
是的,如果您从另一个表中引用Employee,那么可以使Employee成为实例变量。在这种情况下进行子类化是错误的,因为根据您的描述,工作流程并不是一种特殊的员工。问问自己这些实体的生命周期是相同还是不同,以及子类在所有情况下是否可以替代超类。
对于某些实体是另一个实体的专用版本并且您希望通过其超类引用专用版本的情况,子类应该是最后保留的。
在对象关系映射中使用子类化的特定模式:每个类层次结构的表,每个子类的表,每个具体实体的表等。The Hibernate documentation describes them。当表格属于其中一种模式时,您可以使用继承将对象映射到表。即使你没有使用Hibernate,这仍然是一个很好的例子。
答案 1 :(得分:2)
我认为角色类是一种很棒的设计方法,许多开发人员都不使用它们。这与角色类的规范使用相匹配:当实体参与不同的活动时,在这些活动中,该类型的视图是不同的。一个很好的例子如下。假设我们正在为工资单建模。我们的用户既是获得付款的员工之一,也是应用中的管理员。在Java中,我们必须将其建模为角色类,因为我们没有多重继承,但它实际上是一个更准确的表示,因为角色类,如果它确实赋予任何其他行为或属性,它在上下文中这样做它自己的行为。因此,例如,在工资单中授予管理员所需的任何权力都限于该领域。
这也不是一种或两种情况:在工资单中,您可能希望表明某些员工也是经理。这可能最好通过继承完成,但角色类仍然有效,作为表示参与的一种方式。
答案 2 :(得分:2)
您无法将JavaBean直接映射到Tables,因为OO与Relational(Database)不同。
您可以使用ORM(如Hibernate)将JavaBean映射到SGBD表。
从OO的角度来看,bean应该是那样的
public class Employee {
private String id;
private String firstName;
private String lastName;
private String phone;
private String deptNo;
}
public class WorkflowPlayer {
private String id;
private String roleRequired;
private Employee employee;
private Role roleClass;
}
public class RoleClass {
private String id;
private String name;
private String label;
private String description;
}