【发布时间】:2018-11-05 01:24:31
【问题描述】:
假设我有一个包含两个表的数据库:companies 和 employees。
如果我从这两个表中选择、更新、添加和删除,我应该创建 companyDAO 和 employeeDAO 吗?
或者我应该创建一个 DAO,在其中我将为数据库中的每个表编写 CRUD 操作的方法?
【问题讨论】:
假设我有一个包含两个表的数据库:companies 和 employees。
如果我从这两个表中选择、更新、添加和删除,我应该创建 companyDAO 和 employeeDAO 吗?
或者我应该创建一个 DAO,在其中我将为数据库中的每个表编写 CRUD 操作的方法?
【问题讨论】:
为整个数据库创建一个 DAO 不能很好地扩展。添加的数据库表越多,它就越大。在工业中,您几乎总是会看到一对一的 DAO 与表的关系。与往常一样,有例外和警告。
【讨论】:
顾名思义,代表数据访问对象的DAO是一个访问ONE对象或类的实体。为每个业务实体拥有一个 DAO 是标准的软件工程和企业行业(尤其是 Java)最佳实践。
如果您在多个 DAO 中重用相似的行为和数据,通常可以方便地创建一个基本 DAO 并由其他 DAO 扩展它。
【讨论】:
是的,为大多数实体设置单独的DAOs 是有意义的。
您通常会使用泛型DAOs,即您有一个抽象超类。在一个简化的示例中,它可能如下所示:
class BaseDAO<T extends Entity>
提供了许多有用的方法来查找、删除或更新实体。为每个实体定义该 BaseDAO 的子类时,例如
class EmployeeDAO extends BaseDAO<Employee>
您确保您的所有 DAO 为您仅必须在 BaseDAO 中实现的方法返回正确的类型。因此,EmployeeDAO 中的findAll() 方法将返回List<Employee>。
此外,您可以为某些实体实现自定义操作的方法,例如findEmployeesWithSalaryAbove(long) 在各自的班级。您不希望这些使单个 DAO 混乱。
【讨论】:
您应该为单个 Hibernate 模型创建一个 DAO(在大多数情况下)。 模型可以是所有表列、部分表列或多个表列的组合。这完全取决于您的需求。
当您想要执行此操作时(将单个 DAO 映射实体到多个表),当您想要将休眠模型与业务模型分开时。
【讨论】: