Самый эффективный способ отразить наследственные отношения в DAO? - PullRequest
2 голосов
/ 12 февраля 2011

Работа над бизнес-приложением с использованием структуры MVC и архитектуры Business Object / DAO . Для любого обычного бизнес-объекта функции CRUD довольно просты. Но как лучше всего обрабатывать отношения между родителями и детьми, такие как «Клиент - это пользователь»?

Я знаю, что участвуют следующие классы:

User, UserDAO, Customer, CustomerDAO

Класс Customer может отлично наследоваться от User, но как вы лучше всего это отразите в функциях DAO CRUD?

Ответы [ 2 ]

10 голосов
/ 12 февраля 2011

Мартин Фаулер задокументировал несколько объектно-реляционных структурных шаблонов , которые могут помочь:

1) Наследование одной таблицы : Представляет иерархию наследования классов в видеодна таблица, в которой есть столбцы для всех полей различных классов.

например, Employee и Customer оба наследуются от User и оба хранятся в таблице User, со столбцом, который определяет, какой типпользователя представляет конкретная запись.

2) Наследование таблиц классов : Представляет иерархию наследования классов с одной таблицей для каждого класса.

например, Employee и Customer оба наследуются от User, и есть три таблицы для представления этого.Таблица User хранит свойства, общие для всех пользователей.Таблица Employee имеет указатель на таблицу User и хранит только те свойства, которые относятся к Employees.То же самое относится и к таблице клиентов.

3) Наследование конкретной таблицы : Представляет иерархию наследования классов с одной таблицей для каждого конкретного класса в иерархии.

например, Employee и Customer оба наследуют от абстрактного класса User, и есть две таблицы для представления этого.Таблица клиентов и таблица сотрудников.Каждая таблица хранит информацию, общую для пользователей, но также хранит уникальные свойства.

7 голосов
/ 12 февраля 2011

Вы можете создать экземпляр UserDAO в CustomerDAO. Вам необходимо взаимодействовать с таблицами 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 не завершалось независимо.

...