持久化模式,第 2 部分: 提高代码重用和改进性能
2010-04-02 00:00:00 来源:WEB开发网清单 3. 多态性查询
Criteria crit = session.createCriteria(PayRate.class);
crit.add(Restictions.eq("jobRole", "Programmer");
...
Criteria salaryCrit = session.createCriteria(SalaryPayRate.class);
salaryCrit.add(Restrictions.eq("yearlyRate",50000.00));
有时候,实体的识别器不是简单的单一列。可能由多个列组成识别器的逻辑,逻辑也可能不是基本的当 A 列等于 X 时 逻辑。也可以定义一个公式来决定要创建的实例。例如,如果一列中的值是 null,就创建某个类的实例;如果这一列包含实际值,就创建不同的实例。这些类型的策略常常意味着数据模型应该重构,但是遗留数据模型可能无法进行重构。
利用多态性隐藏信息
使用 Hibernate 为模型中的实体选择行为是很不错,但是对于不同的实体常常还需要不同的数据集。如果一些字段对于某个子类有意义,但是对于其他子类没有意义,就可以把它们从超类中删除,并放到它们所属的子类中。这可以避免未来的代码维护者意外使用不属于当前实例的字段。
例如,为了计算小时制职员的工资,需要加班时间信息,而这一信息对于计算周薪制职员的工资是不必要的。加班工资对于周薪制职员没有意义,所以可以把它从 PayRate 类转移到 HourlyRate 类中。同样,yearlyRate 字段不属于 HourlyRate 类,可以转移到 SalaryRate 类中。
PayRate 类定义周薪制职员和小时制职员通用的字段,见清单 4:
清单 4. PayRate 类
public abstract class PayRate extends BaseDomainEntity{
public String getJobRole(){//...}
@OneToMany(cascade = CascadeType.ALL)
@OrderBy("payPeriodBeginDate")
public List<PayCheck> getPayChecks(){//...}
@OneToOne(cascade = CascadeType.ALL)
public Employee getAssociatedEmployee(){//...}
}
更多精彩
赞助商链接