1

我在质疑我设计 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;

这三个模型也直接对应于数据库表(Employee 对我来说是一个只读视图,如果这很重要)

然后在我看来,我会做类似的事情
workflow_player.employee.first_name
workflow_player.roleClass.label

将 Employee 设为实例变量是否可以接受?或者我应该改为使用 Employee 扩展 WorkflowPlayer 然后做
workflow_player.first_name

这对员工有意义,但对角色类没有意义。
workflow_player.description //不!

我只想使用一致的 [正确] 模式

4

3 回答 3

2

是的,如果您从另一个表中引用它,则可以将 Employee 设为实例变量。在这种情况下子类化是错误的,因为根据您的描述,听起来工作流不是一种专门的员工。问问自己这些实体的生命周期是否相同或不同,以及在所有情况下子类是否可以替代超类。

子类化应该是为某些实体是另一个实体的专用版本并且您希望通过其超类引用专用版本的情况保留的最后手段。

在对象关系映射中使用子类化有一些特定的模式:每个类层次结构的表、每个子类的表、每个具体实体的表等。Hibernate 文档描述了它们。当您的表属于其中一种模式时,您将在将对象映射到表时使用继承。即使你没有使用 Hibernate,这仍然是一个很好的例子。

于 2013-06-13T16:07:49.963 回答
2

我认为角色类是一种很好的设计方法,许多开发人员不使用它们。这与角色类的规范使用相匹配:当一个实体参与不同的活动时,并且在这些活动中,该类型的视图是不同的。一个很好的例子如下。假设我们正在为工资单建模。我们有一个用户,他既是获得报酬的员工之一,又是应用程序的管理员。在 Java 中,我们必须将其建模为角色类,因为我们没有多重继承,但它确实是一种更准确的表示,因为角色类,如果它确实赋予任何额外的行为或属性,它是在上下文中这样做的自己的行为。因此,例如,您需要授予工资单中的管理员的任何权力都仅限于该领域。

这也不是非此即彼的情况:在工资单中,您可能希望表明某些员工也是经理。这可能最好通过继承来完成,但角色类仍然有效,再次作为一种表示参与的方式。

于 2013-06-13T16:08:43.100 回答
2

You can't map JavaBean directly to Tables, because OO is not the same as Relational (Database).

You could use an ORM, like Hibernate, to map you JavaBean to SGBD Tables properly.

From an OO point of view, beans should be like that

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;
}
于 2013-06-13T16:13:30.210 回答