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表.每个表都存储用户常用的信息,但也存储唯一的属性.
您可以在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表不会独立失败.