使用MVC结构和Business Object / DAO架构处理业务应用程序。对于任何普通的业务对象,CRUD函数都相当简单。但是,处理像“客户是用户”这样的亲子关系的最佳方式是什么?
我知道涉及以下课程:
User, UserDAO, Customer, CustomerDAO
Customer
类可以从User
继承,但是如何在DAO CRUD函数中最好地反映这一点?
答案 0 :(得分:10)
Martin Fowler记录了一些可能有帮助的Object-Relational Structural Patterns:
1)Single Table Inheritance:将类的继承层次结构表示为单个表,其中包含各种类的所有字段的列。
e.g。 Employee
和Customer
都从User
继承,并且都存储在User表中,其中的列用于确定特定记录所代表的用户类型。
2)Class Table Inheritance:表示类的继承层次结构,每个类有一个表。
e.g。 Employee
和Customer
都从User
继承,并且有三个表来表示这一点。 User表存储所有用户共有的属性。 Employee表具有指向User表的指针,仅存储与Employees相关的属性。 Customer表也是如此。
3)Concrete Table Inheritance:表示类的继承层次结构,层次结构中每个具体类具有一个表。
e.g。 Employee
和Customer
都继承自抽象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表不会独立失败。