为每层表结构获取 DAO

Posted

技术标签:

【中文标题】为每层表结构获取 DAO【英文标题】:Getting DAOs for Table-per-Hierarchy structure 【发布时间】:2011-10-01 12:22:47 【问题描述】:

假设我有一个User 类和两个子类EmployeeCustomer。我将此层次结构实现为 DB 中的每个层次结构的表,其中有一列用于指定用户的类型。查询此表时,我需要返回正确类型的对象。

我是否需要为每种类型的对象(如 CustomerDAOEmployeeDAO)提供单独的 DAO,因此每个对象都返回各自的 CustomerEmployee 对象。如果是这样,如何在不使用的情况下从DAOFactory 获取它们:

if(type.equlas('customer'))
    return customerDao;
else
    retrun employeeDao;

因为实现User 的类型可能会改变,我不想每次都改变条件。

或者还有其他方法吗?任何想法将不胜感激。

注意:我没有使用任何 ORM 框架,也不打算使用。

【问题讨论】:

你能多谈谈你的类层次结构吗? Employee 是 User 的子类,还是两个实体之间存在某种联系?另外,您希望从您的 DAO 中返回什么引用类型? @jtoberon 是的 Employee 和 Customer 是 User 类型。我只有用户 ID。根据这些 ID,我必须查询同一个表,如果用户类型为客户,则获取 Customer,如果类型为员工,则获取 Employee 【参考方案1】:

如果每种类型的持久性代码相同,则可以有 1 个通用 DAO。

所以你的用户 dao,可能是这样的:

interface DAO<T, ID> 
  T create(T t);
  T read(ID id);
  T update(T t);
  void delete(T t);  


class UserDAO<T extends User> implements DAO<T> 
    // Your methods for crud operations will be limited to types of User.

然后你的工厂类可以简单地通过指定正确的类型来实例化正确的 DAO。

class DAOFactory 
  public UserDAO<Employee> getEmployeeDAO() 
    return new UserDAO<Employee> ();
  

问候 优素福

【讨论】:

不,每个DAO的代码都不一样。每个对象都需要填写各自的数据。我认为这样我仍然需要检查 if ... else 中的对象类型以获得所需的 DAO。 我认为没有必要检查您的工厂是否有针对每种类型的方法...?您的 if 语句暗示您返回的 DAO 是通用的。是这样吗? 也许我在这里遗漏了一些东西,但我不需要知道我想要什么类型的 DAO,在 DAO 工厂上调用正确的方法。无论如何感谢您的回复。我试图以另一种方式解决问题,以消除对多个 DAO 的需求。下次我遇到类似的问题时,我想我会尝试反射。 只有当你知道你正在使用什么数据时,从工厂返回正确的 DAO 才有意义。因此,当您想在不知道任何类型的情况下(这正是您想要的)查询表时,您必须使用基类的 DAO,它将返回用户引用。 这就是我想知道的。用户对象对我不起作用。我需要具体的子类,例如 Customer 和 Employee。

以上是关于为每层表结构获取 DAO的主要内容,如果未能解决你的问题,请参考以下文章

mybatis根据数据库表结构自动生成实体类,dao,mapper

Java项目目录结构

Redis5设计与源码分析 (第3章 跳跃表)

使用torchsummary打印torch模型结构,包括每层名字以及形状

MySQL InnoDB的存储结构总结

数据结构 哈希表建立