【问题标题】:Most effective way to reflect inheritance relationship in DAOs?在 DAO 中反映继承关系的最有效方法是什么?
【发布时间】:2011-06-26 04:27:24
【问题描述】:

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

我知道涉及到以下类:

User, UserDAO, Customer, CustomerDAO

Customer 类可以继承 User 就好了,但是如何在 DAO CRUD 函数中最好地体现这一点?

【问题讨论】:

  • 你有两张表——Users 和Customers?我会感到惊讶。我会想到一个带有user_type 字段的users 表。然后只有一个 VO,即Users。如果user.isCustomer() 是真的,那就是客户。所以,要么你不应该使用两个表,要么你不应该使用继承。
  • @Nishant:这根本不是真的。如果客户有用户没有的其他数据,您将用不相关的列将用户表弄得一团糟。用两张表实现继承当然是可行的。
  • @Matt 我不是在谈论可行性,而是更多地考虑设计。客户是用户——将它们放在同一张表中是个好主意。这将有助于搜索,而且对我来说更有意义。如果您担心混乱,请将无关数据外部化。制作一个单独的表customer_details 并将其与外键链接。在许多情况下,您可能希望将用户转换为客户。只更改类型而不是在表之间复制数据然后擦除前者更容易。只是我的 2%。

标签: java inheritance crud dao business-objects


【解决方案1】:

您可以在 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 表不会单独失败。

【讨论】:

    【解决方案2】:

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

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

    例如Employee 和 Customer 都继承自 User 并且都存储在 User 表中,其中有一列确定特定记录代表的用户类型。

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

    例如Employee 和 Customer 都继承自 User 并且有三个表来表示这一点。 User 表存储所有用户共有的属性。 Employee 表有一个指向 User 表的指针,并且只存储与Employees 相关的属性。 Customer 表也是如此。

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

    例如Employee 和 Customer 都继承自抽象 User 类,并且有两个表来表示这一点。一个客户表和一个员工表。每个表存储用户共有的信息,但也存储独特的属性。

    【讨论】:

    • 谢谢。这很有帮助。所以,我使用#2。关于如何在类表继承下最好地为员工/客户/用户实现 CRUD 函数有什么想法吗?
    • 很高兴您发现这篇文章对您有帮助!我喜欢 Matt 将 UserDAO 包装在 CustomerDAO 中的想法。
    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2011-07-13
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多