持久化模式,第 2 部分: 提高代码重用和改进性能
2010-04-02 00:00:00 来源:WEB开发网简介
本系列包含两篇文章,第 1 部分 讨论了 Hibernate 和其他对象-关系映射(ORM)工具的几个基本最佳实践。通过使用通用基领域类和接口、集中的审计和泛型数据访问对象(泛型 DAO),应用程序可以建立更紧凑且可维护的领域模型和持久化层。
通过应用 第 1 部分 中的概念,可以提供新的代码重用机会。在这个部分中,我们首先讨论如何使用 Hibernate 和多态性在领域模型中集成行为。接下来,继续 第 1 部分 对泛型 DAO 的讨论。在应用程序中集成和使用泛型 DAO 之后,您可能会发现更多的通用操作。我们将演示如何在泛型 DAO 中集成数据分页和查询,从而减少代码。最后,讨论改进领域模型性能的策略。如果不采用这些策略,领域模型中配置错误的关联可能会导致大量多余的查询,也可能获取不需要的记录,从而浪费资源。
再论模型:让 ORM 选择行为
因为数据库表本身没有行为,开发人员常常把领域模型实体的行为放在服务或视图层中。但是,这种方式并不合适,因为这违反了面向对象的基本规则:对象拥有行为和数据。如果把行为从对象转移到服务中,对象就成了纯粹的数据容器。另外,把实体的行为放在服务或视图层中,会导致实体的核心逻辑分散在应用程序中的许多地方,导致维护问题。Hibernate 等工具有助于把行为与数据一起放在模型中,这有助于构造领域驱动的模型。
我们继续以 第 1 部分 中使用的职员示例为例。图 1 给出的对象模型定义了工资支付方式功能:
图 1. 工资支付方式计算的对象模型
假设数据库包含一个 Employee 表,这个表与 PayRate 表相关联。工资支付方式表有一个 employeeType 列,这个列有两个有效值:Hourly 和 Salary。用来计算职员工资的算法取决于这个列的值,因为小时制职员的工资计算方法与周薪制职员的工资计算方法不一样。周薪制职员每周领取相同的工资,无论他们一周工作了多少小时。对于小时制职员,必须根据他们工作的小时数支付工资,还可能需要计算加班时间。
赞助商链接