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

use*_*584 2 java inheritance dao crud business-objects

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

我知道涉及以下课程:

User, UserDAO, Customer, CustomerDAO
Run Code Online (Sandbox Code Playgroud)

该Customer班可从继承User就好了,但你如何最好的DAO CRUD功能体现呢?

Bra*_*don 10

Martin Fowler记录了一些可能有用的对象关系结构模式:

1)单表继承:将类的继承层次结构表示为单个表,该表具有各种类的所有字段的列.

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

2)类表继承:表示类的继承层次结构,每个类有一个表.

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

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

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


Mat*_*t H 7

您可以在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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