反映DAO中继承关系的最有效方法?

时间:2011-02-12 19:07:09

标签: java inheritance crud dao business-objects

使用MVC结构和Business Object / DAO架构处理业务应用程序。对于任何普通的业务对象,CRUD函数都相当简单。但是,处理像“客户是用户”这样的亲子关系的最佳方式是什么?

我知道涉及以下课程:

User, UserDAO, Customer, CustomerDAO

Customer类可以从User继承,但是如何在DAO CRUD函数中最好地反映这一点?

2 个答案:

答案 0 :(得分:10)

Martin Fowler记录了一些可能有帮助的Object-Relational Structural Patterns

1)Single Table Inheritance:将类的继承层次结构表示为单个表,其中包含各种类的所有字段的列。

e.g。 EmployeeCustomer都从User继承,并且都存储在User表中,其中的列用于确定特定记录所代表的用户类型。

2)Class Table Inheritance:表示类的继承层次结构,每个类有一个表。

e.g。 EmployeeCustomer都从User继承,并且有三个表来表示这一点。 User表存储所有用户共有的属性。 Employee表具有指向User表的指针,仅存储与Employees相关的属性。 Customer表也是如此。

3)Concrete Table Inheritance:表示类的继承层次结构,层次结构中每个具体类具有一个表。

e.g。 EmployeeCustomer都继承自抽象User类,并且有两个表来表示它。 Customer表和Employee表。每个表都存储用户常用的信息,但也存储唯一的属性。

答案 1 :(得分:6)

您可以在CustomerDAO中拥有UserDAO的实例。您需要与User表和Customer表进行交互以覆盖基类和子类列。例如:

public class CustomerDAO
{
    UserDAO userDao;

    // ... initialization ...

    public void update(Customer customer)
    {
        // ... first execute update of customer table ...

        userDao.update(customer);   // Should be able to pass Customer to UserDAO due to inheritance
    }

    public void insert(Customer customer)
    {
        // First insert a row in the User table so that the ID of the user can be determined.
        userDao.insert(customer);

        // ... Now execute insertion of row into Customer table ...
    }

    public void delete(Customer customer)
    {
        // ... first delete Customer row ...

        // Now delete base class User row.
        userDao.delete(customer);
    }
}

当然,每个Customer操作都应该包含在一个事务中,以便更新User和Customer表不会独立失败。