【问题标题】:Getting DAOs for Table-per-Hierarchy structure为每层表结构获取 DAO
【发布时间】: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

标签: java orm polymorphism dao table-per-hierarchy


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 2019-09-07
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
相关资源
最近更新 更多