持久化模式,第 2 部分: 提高代码重用和改进性能
2010-04-02 00:00:00 来源:WEB开发网如果把工资计算代码放在领域实体中,就会产生更紧凑的领域模型,而且避免把逻辑分散在各层中。工资支付方式示例使用单一表继承。为此,首先需要定义一个识别器(discriminator) — 识别器是表中的一列,它告诉 Hibernate 为了表示数据库中的数据应该实例化的对象类型。对于这个示例,employeeType 列作为识别器。接下来,必须定义超类,这个类作为这些实体的基类 — 这个示例使用抽象类 PayRate。清单 1 给出这个超类的注解和类声明:
清单 1. 超类的注解和类声明
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn( name="employeeType", discriminatorType=DiscriminatorType.STRING )
public abstract class PayRate extends BaseEntity{//...}
最后,需要为每个可能的子类创建实现。清单 2 为周薪制职员和小时制职员定义了子类:
清单 2. 子类的定义
@Entity
@DiscriminatorValue("Salary")
public class SalaryPayRate extends PayRate {//...}
@Entity
@DiscriminatorValue("Hourly")
public class HourlyPayRate extends PayRate {//...}
在查询 PayRate 表时,如果 employeeType="Salary",Hibernate 就自动创建 SalaryPayRate 的实例;如果 employeeType="Hourly",就创建 HourlyPayRate 的实例。然后,应用程序代码可以调用 createPayCheck 方法,并确保用正确的算法计算工资。Hibernate 作为这些类的工厂,它会在正确的时间创建正确的实例。
在编写查询时,Hibernate 还能够感知多态性。在编写寻找所有周薪制职员的查询时,Hibernate 会在查询中加上 employeeType="Salary",这样就能够获得所需的结果。清单 3 给出一个多态性查询示例;注意,这个查询并没有什么特殊之处:
更多精彩
赞助商链接